merge from ecomp a88f0072 - Modern UI 86/78686/2
authorIttay Stern <ittay.stern@att.com>
Wed, 29 Aug 2018 14:01:32 +0000 (17:01 +0300)
committerIttay Stern <ittay.stern@att.com>
Mon, 18 Feb 2019 16:35:30 +0000 (18:35 +0200)
Issue-ID: VID-378
Change-Id: Ibcb23dd27f550cf32ce2fe0239f0f496ae014ff6
Signed-off-by: Ittay Stern <ittay.stern@att.com>
522 files changed:
vid-webpack-master/.angular-cli.json [deleted file]
vid-webpack-master/.babelrc [new file with mode: 0644]
vid-webpack-master/.gitignore
vid-webpack-master/.slignore [new file with mode: 0644]
vid-webpack-master/angular.json [new file with mode: 0644]
vid-webpack-master/cypress.json
vid-webpack-master/cypress/integration/iFrames/ala-carte.e2e.ts
vid-webpack-master/cypress/integration/iFrames/auditInfo.modal.e2e.ts
vid-webpack-master/cypress/integration/iFrames/browse-sdc.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/drawingBoard.e2e.ts
vid-webpack-master/cypress/integration/iFrames/instantiationStatus.e2e.ts
vid-webpack-master/cypress/integration/iFrames/network.popup.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/permission.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/retry.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/searchExistingInstance.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/service.popup.e2e.ts
vid-webpack-master/cypress/integration/iFrames/serviceWithNetwork.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/serviceWithVnfNetwork.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/softDeleteAndResume.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/tenantIsolation.e2e.ts
vid-webpack-master/cypress/integration/iFrames/viewEdit.e2e.ts
vid-webpack-master/cypress/integration/iFrames/viewOnlyDrawingBoard.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/vnf.popup.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/vnfGroups.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/welcomePage.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/shared/error.message.popup.e2e.ts
vid-webpack-master/cypress/integration/shared/spinner.e2e.ts
vid-webpack-master/cypress/support/application/application.session.actions.ts
vid-webpack-master/cypress/support/elements/element.actions.ts
vid-webpack-master/cypress/support/elements/element.input.actions.ts
vid-webpack-master/cypress/support/elements/element.select.actions.ts
vid-webpack-master/cypress/support/index.js
vid-webpack-master/cypress/support/jsonBuilders/jsonBuilder.ts
vid-webpack-master/cypress/support/jsonBuilders/mocks/aai.mock.ts
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aLaCarteAuditInfoMSO.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiGetHomingData.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiServiceInstances.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiServices.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubDetails.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForActiveFabricConfigService.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForComplexService.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForCreatedFabricConfigService.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForDeactivatedFabricConfigService.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForFabricConfigService.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForServiceWithSomeVFModule.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/activeFabricConfigService.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/asyncInstantiation.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicAsyncInstantiation.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicFabricConfigService.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicNetworkInstance.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicNetworkModel.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicRedux.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/Dror_service1806_Macro1.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/Dror_service1806_Macro_NW.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/list-services.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/service-with-configuration.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug_aLaCarteServiceWrongPopup/list-services.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug_aLaCarteServiceWrongPopup/serviceWithoutInstantiationType.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/categoryParametres.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/createdFabricConfigService.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/deactivatedFabricConfigService.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/flags.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/responceForFailedInstance.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/service.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceModels/ecompNamingFalseModel.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceModels/serviceForNewViewEdit.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/aaiServiceInstances.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/aaiSubDetailsForServiceWithNetwork.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/aaiSubViewEditForServiceWithNetwork.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/serviceWithNetwork.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithVnfAndVfModules.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/subscribers.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/tenants.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/topMenuInfo.json
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/version.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/vnfGroupBasicServiceInstance.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/vnfGroupsBasicModel.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/permission.mock.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/vid.mock.ts
vid-webpack-master/cypress/support/jsonBuilders/models/asyncInstantiation.model.ts
vid-webpack-master/cypress/support/jsonBuilders/models/service.model.ts
vid-webpack-master/cypress/support/steps/drawingBoard/drawingBoardComponentInfo.steps.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/drawingBoard/drawingBoardModel.steps.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/drawingBoard/drawingBoardTree.steps.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/drawingBoard/general.steps.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/fill.network.step.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/fill.service.popup.step.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/fill.vfModule.step.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/fill.vnf.popup.step.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/general/clickOutside.step.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/general/compareDeepObjects.step.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/genericForm/checkPopover.step.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/genericForm/genericFormAction.steps.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/login.step.ts
vid-webpack-master/cypress/support/steps/menu.step.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/openInstanceAuditInfoModal.step.ts [new file with mode: 0644]
vid-webpack-master/karma.conf.js [deleted file]
vid-webpack-master/package-lock.json
vid-webpack-master/package.cypress.json [new file with mode: 0644]
vid-webpack-master/package.json
vid-webpack-master/polyfills.ts
vid-webpack-master/pom.xml
vid-webpack-master/processCss.js [new file with mode: 0644]
vid-webpack-master/src/app/angular-tree-component.scss [new file with mode: 0644]
vid-webpack-master/src/app/app.component.html
vid-webpack-master/src/app/app.component.ts
vid-webpack-master/src/app/app.module.ts
vid-webpack-master/src/app/app.routing.ts
vid-webpack-master/src/app/browseSdc/browseSdc.component.html [deleted file]
vid-webpack-master/src/app/browseSdc/browseSdc.component.scss [deleted file]
vid-webpack-master/src/app/browseSdc/browseSdc.component.ts [deleted file]
vid-webpack-master/src/app/browseSdc/browseSdc.module.ts [deleted file]
vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.component.ts [deleted file]
vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.css [deleted file]
vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.html [deleted file]
vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.html [deleted file]
vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.scss [deleted file]
vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.ts [deleted file]
vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts [deleted file]
vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.component.ts [deleted file]
vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.html [deleted file]
vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.scss [deleted file]
vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.spec.ts [deleted file]
vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.ts [deleted file]
vid-webpack-master/src/app/components/service-popup/service-instance-details/servicePopupDataModel.ts [deleted file]
vid-webpack-master/src/app/components/service-popup/service-popup.component.ts [deleted file]
vid-webpack-master/src/app/components/service-popup/service-popup.html [deleted file]
vid-webpack-master/src/app/components/service-popup/service-popup.scss [deleted file]
vid-webpack-master/src/app/components/service-popup/service-popup.service.spec.ts [deleted file]
vid-webpack-master/src/app/components/service-popup/service-popup.service.ts [deleted file]
vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.component.ts [deleted file]
vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.html [deleted file]
vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts [deleted file]
vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.ts [deleted file]
vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnfPopupDataModel.ts [deleted file]
vid-webpack-master/src/app/components/vnf-popup/vnf-popup-service.ts [deleted file]
vid-webpack-master/src/app/components/vnf-popup/vnf-popup.components.ts [deleted file]
vid-webpack-master/src/app/components/vnf-popup/vnf-popup.html [deleted file]
vid-webpack-master/src/app/configuration/vid.configuration.ts [deleted file]
vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.html [deleted file]
vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.scss [deleted file]
vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.ts [deleted file]
vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts [deleted file]
vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.html [deleted file]
vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.scss [deleted file]
vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.ts [deleted file]
vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts [deleted file]
vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.html [deleted file]
vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts
vid-webpack-master/src/app/drawingBoard/drawingBoard.routing.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/guards/servicePlanningGuard/drawingBoardGuard.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.spec.ts [moved from vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.spec.ts with 83% similarity]
vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.html [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/tmp_instansiate_request.ts [moved from vid-webpack-master/src/app/drawingBoard/drawing-board-header/tmp_instansiate_request.ts with 97% similarity]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.scss [moved from vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.scss with 53% similarity]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/instance.tree.generator.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.html [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board.modes.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.html [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/basic.model.info.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToTree.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.html [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html
vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss
vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts
vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/factories/models/requestDetails.model.ts
vid-webpack-master/src/app/factories/mso.factory.spec.ts
vid-webpack-master/src/app/factories/mso.factory.ts
vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts [new file with mode: 0644]
vid-webpack-master/src/app/featureFlag/featureFlag.module.ts [new file with mode: 0644]
vid-webpack-master/src/app/featureFlag/service/featureFlag.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/global.actions.ts [deleted file]
vid-webpack-master/src/app/healthStatus/health-status.component.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/healthStatus/health-status.component.ts
vid-webpack-master/src/app/healthStatus/health-status.module.ts [new file with mode: 0644]
vid-webpack-master/src/app/healthStatus/health-status.routing.ts [new file with mode: 0644]
vid-webpack-master/src/app/home/home.component.e2e-spec.js [deleted file]
vid-webpack-master/src/app/home/home.component.html [deleted file]
vid-webpack-master/src/app/home/home.component.scss [deleted file]
vid-webpack-master/src/app/home/home.component.ts [deleted file]
vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts
vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.routing.ts [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts [deleted file]
vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html
vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts
vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts
vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts
vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts
vid-webpack-master/src/app/modules/inputs.module.ts [deleted file]
vid-webpack-master/src/app/service.actions.ts [deleted file]
vid-webpack-master/src/app/service.reducer.spec.ts [deleted file]
vid-webpack-master/src/app/service.reducer.ts [deleted file]
vid-webpack-master/src/app/services/aaiService/aai.service.ts [deleted file]
vid-webpack-master/src/app/services/msoService/mso.service.ts [deleted file]
vid-webpack-master/src/app/services/sdc.service.ts [deleted file]
vid-webpack-master/src/app/services/service-planning.service.spec.ts [deleted file]
vid-webpack-master/src/app/services/service-planning.service.ts [deleted file]
vid-webpack-master/src/app/shared/api.service.ts [deleted file]
vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.html [moved from vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.html with 68% similarity]
vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.scss [moved from vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.scss with 90% similarity]
vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.ts [moved from vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.component.ts with 98% similarity]
vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.html [moved from vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.html with 95% similarity]
vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.scss [moved from vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.scss with 100% similarity]
vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts
vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/error-msg/error-msg.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/error/error.component.service.ts
vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/file/fileUnit.enum.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.scss [moved from vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.service.ts with 100% similarity]
vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss
vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.scss [moved from vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.scss with 84% similarity]
vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.scss [moved from vid-webpack-master/src/app/components/vnf-popup/vnf-popup.scss with 84% similarity]
vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/generic-popup.interface.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts
vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts
vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts
vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts
vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts
vid-webpack-master/src/app/shared/components/model-information/model-information.html
vid-webpack-master/src/app/shared/components/model-information/model-information.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/model-information/model-information.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/model-information/model-information.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html
vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss
vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts
vid-webpack-master/src/app/shared/components/popover/popover.component.html
vid-webpack-master/src/app/shared/components/popover/popover.component.scss
vid-webpack-master/src/app/shared/components/popover/popover.component.ts
vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/member-table-row.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/spinner/spinner.component.html
vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts
vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts
vid-webpack-master/src/app/shared/components/svg/svg-component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.spec.ts [deleted file]
vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.ts [deleted file]
vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts
vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts
vid-webpack-master/src/app/shared/directives/svg/svg.directive.html [deleted file]
vid-webpack-master/src/app/shared/directives/svg/svg.directive.ts [deleted file]
vid-webpack-master/src/app/shared/index.ts [deleted file]
vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts
vid-webpack-master/src/app/shared/models/VnfMember.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/formControlModels/checkboxFormControl.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/formControlModels/dropdownFormControl.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/formControlModels/fileFormControl.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/formControlModels/formControl.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/formControlModels/formControlTypes.enum.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/formControlModels/formPopupDetails.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/formControlModels/inputFormControl.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/formControlModels/multiselectFormControl.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/formControlModels/numberFormControl.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/inputTypes.ts
vid-webpack-master/src/app/shared/models/lcpRegion.ts
vid-webpack-master/src/app/shared/models/level1Instance.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/modelInfo.ts
vid-webpack-master/src/app/shared/models/networkInstance.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/networkModel.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/networkTreeNode.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/nodeInstance.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/nodeModel.ts
vid-webpack-master/src/app/shared/models/productFamily.ts
vid-webpack-master/src/app/shared/models/serviceInstance.ts
vid-webpack-master/src/app/shared/models/serviceInstanceActions.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/serviceModel.ts
vid-webpack-master/src/app/shared/models/serviceProxyModel.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/tenant.ts
vid-webpack-master/src/app/shared/models/treeNodeModel.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vfModule.ts
vid-webpack-master/src/app/shared/models/vfModuleInstance.ts
vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts
vid-webpack-master/src/app/shared/models/vnfGroupInstance.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vnfGroupModel.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vnfGroupTreeNode.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vnfInstance.ts
vid-webpack-master/src/app/shared/models/vnfModel.ts
vid-webpack-master/src/app/shared/models/vnfTreeNode.ts
vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts
vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts
vid-webpack-master/src/app/shared/pipes/data-filter.pipe.ts [deleted file]
vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts
vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts
vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.ts [moved from vid-webpack-master/src/app/shared/pipes/highlight-filter.pipe.ts with 86% similarity]
vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts
vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts
vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.ts [moved from vid-webpack-master/src/app/services/flags.resolve.ts with 77% similarity]
vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.spec.ts [deleted file]
vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts
vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts
vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts
vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts
vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts
vid-webpack-master/src/app/shared/services/aaiService/aai.actions.ts [moved from vid-webpack-master/src/app/services/aaiService/aai.actions.ts with 94% similarity]
vid-webpack-master/src/app/shared/services/aaiService/aai.epics.ts [moved from vid-webpack-master/src/app/services/aaiService/aai.epics.ts with 69% similarity]
vid-webpack-master/src/app/shared/services/aaiService/aai.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/services/aaiService/aai.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/services/aaiService/model/crawledAaiService.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts [moved from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts with 100% similarity]
vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts [moved from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts with 100% similarity]
vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts [moved from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts with 53% similarity]
vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getServicesResponseInterface.ts [moved from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServicesResponseInterface.ts with 100% similarity]
vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts [moved from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts with 100% similarity]
vid-webpack-master/src/app/shared/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts [moved from vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts with 53% similarity]
vid-webpack-master/src/app/shared/services/configuration.service.ts [moved from vid-webpack-master/src/app/services/configuration.service.ts with 82% similarity]
vid-webpack-master/src/app/shared/services/data.service.ts [moved from vid-webpack-master/src/app/services/data.service.ts with 100% similarity]
vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts
vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts
vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/services/msoService/mso.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/services/msoService/mso.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/shared.module.ts
vid-webpack-master/src/app/shared/store/epics.ts [moved from vid-webpack-master/src/app/store/epics.ts with 88% similarity]
vid-webpack-master/src/app/shared/store/module.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/store/reducers.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/general/general.action.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/general/general.actions.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/global/global.actions.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.ts [moved from vid-webpack-master/src/app/global.reducer.ts with 53% similarity]
vid-webpack-master/src/app/shared/storeUtil/utils/main.reducer.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/network/network.actions.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/service/service.actions.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.actions.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.actions.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.actions.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/utils/constants.ts
vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts
vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts
vid-webpack-master/src/app/shared/utils/util.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/utils/utils.ts [moved from vid-webpack-master/src/app/utils/utils.ts with 97% similarity]
vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.ts [new file with mode: 0644]
vid-webpack-master/src/app/store/module.ts [deleted file]
vid-webpack-master/src/app/store/reducers.ts [deleted file]
vid-webpack-master/src/app/support/support.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/vlanTagging/form-async/form-async.component.ts [moved from vid-webpack-master/src/app/components/form-async/form-async.component.ts with 54% similarity]
vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/vlanTagging/form-async/form-async.style.scss [moved from vid-webpack-master/src/app/components/form-async/form-async.style.scss with 100% similarity]
vid-webpack-master/src/app/vlanTagging/form-async/form-async.template.html [moved from vid-webpack-master/src/app/components/form-async/form-async.template.html with 91% similarity]
vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts
vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html
vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts
vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts
vid-webpack-master/src/app/vlanTagging/vlan-tagging.routing.ts [new file with mode: 0644]
vid-webpack-master/src/assets/img/X_o.svg [deleted file]
vid-webpack-master/src/assets/img/indesign.svg [new file with mode: 0644]
vid-webpack-master/src/assets/img/inprogress.svg [deleted file]
vid-webpack-master/src/assets/img/pause.svg [deleted file]
vid-webpack-master/src/assets/img/pending.svg [deleted file]
vid-webpack-master/src/assets/img/plus-circle.svg [new file with mode: 0644]
vid-webpack-master/src/assets/img/stoped.svg [deleted file]
vid-webpack-master/src/assets/img/success+Circle.svg [deleted file]
vid-webpack-master/src/assets/img/vid-logo.jpg [new file with mode: 0644]
vid-webpack-master/src/index.html
vid-webpack-master/src/jest.config.js [new file with mode: 0644]
vid-webpack-master/src/jestGlobalMocks.ts [new file with mode: 0644]
vid-webpack-master/src/public/index.html
vid-webpack-master/src/setupJest.ts [new file with mode: 0644]
vid-webpack-master/src/style/app.scss
vid-webpack-master/src/styles.scss
vid-webpack-master/src/tsconfig.spec.json
vid-webpack-master/src/wallabyTest.ts [new file with mode: 0644]
vid-webpack-master/tsconfig.json
vid-webpack-master/tslint.json
vid-webpack-master/wallaby.js [new file with mode: 0644]

diff --git a/vid-webpack-master/.angular-cli.json b/vid-webpack-master/.angular-cli.json
deleted file mode 100644 (file)
index 0c2ce56..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-{
-  "$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/.babelrc b/vid-webpack-master/.babelrc
new file mode 100644 (file)
index 0000000..1320b9a
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "presets": ["@babel/preset-env"]
+}
index a4d376c..b54bdfe 100644 (file)
@@ -58,3 +58,6 @@ __build__/**
 # IDE #
 .idea/
 *.swp
+
+# Cypress screenshot #
+/cypress/screenshots
diff --git a/vid-webpack-master/.slignore b/vid-webpack-master/.slignore
new file mode 100644 (file)
index 0000000..9d1cbb0
--- /dev/null
@@ -0,0 +1 @@
+vendor.bundle.js
diff --git a/vid-webpack-master/angular.json b/vid-webpack-master/angular.json
new file mode 100644 (file)
index 0000000..b1f2edc
--- /dev/null
@@ -0,0 +1,109 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "version": 1,
+  "newProjectRoot": "projects",
+  "projects": {
+    "vid-cli": {
+      "root": "",
+      "sourceRoot": "src",
+      "projectType": "application",
+      "architect": {
+        "build": {
+          "builder": "@angular-devkit/build-angular:browser",
+          "options": {
+            "outputPath": "dist",
+            "index": "src/index.html",
+            "main": "src/main.ts",
+            "tsConfig": "src/tsconfig.app.json",
+            "polyfills": "src/polyfills.ts",
+            "assets": [
+              "src/assets",
+              "src/favicon.ico"
+            ],
+            "styles": [
+              "src/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": []
+          },
+          "configurations": {
+            "production": {
+              "optimization": true,
+              "outputHashing": "all",
+              "sourceMap": false,
+              "extractCss": true,
+              "namedChunks": false,
+              "aot": true,
+              "extractLicenses": true,
+              "vendorChunk": false,
+              "buildOptimizer": true,
+              "fileReplacements": [
+                {
+                  "replace": "src/environments/environment.ts",
+                  "with": "src/environments/environment.prod.ts"
+                }
+              ]
+            }
+          }
+        },
+        "serve": {
+          "builder": "@angular-devkit/build-angular:dev-server",
+          "options": {
+            "browserTarget": "vid-cli:build"
+          },
+          "configurations": {
+            "production": {
+              "browserTarget": "vid-cli:build:production"
+            }
+          }
+        },
+        "extract-i18n": {
+          "builder": "@angular-devkit/build-angular:extract-i18n",
+          "options": {
+            "browserTarget": "vid-cli:build"
+          }
+        },
+        "test": {
+          "builder": "@angular-builders/jest:run",
+          "options": {
+            "scripts": [],
+            "styles": [
+              "src/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"
+            ],
+            "assets": [
+              "src/assets",
+              "src/favicon.ico"
+            ]
+          }
+        },
+        "lint": {
+          "builder": "@angular-devkit/build-angular:tslint",
+          "options": {
+            "tsConfig": [
+              "src/tsconfig.app.json",
+              "src/tsconfig.spec.json"
+            ],
+            "exclude": [
+              "**/node_modules/**"
+            ]
+          }
+        }
+      }
+    }
+  },
+  "defaultProject": "vid-cli",
+  "schematics": {
+    "@schematics/angular:component": {
+      "prefix": "app",
+      "styleext": "scss"
+    },
+    "@schematics/angular:directive": {
+      "prefix": "app"
+    }
+  }
+}
index eb8c6e4..7a6bc73 100644 (file)
@@ -5,8 +5,13 @@
   "pageLoadTimeout" : 100000,
   "defaultCommandTimeout" : 10000,
   "responseTimeout" : 100000,
+  "trashAssetsBeforeRuns": false,
+  "video": false,
+  "viewportWidth": 1920,
+  "viewportHeight": 1080,
        "reporterOptions": {
-               "mochaFile": "cypress/junitreport.xml",
-               "toConsole": true
+               "mochaFile": "cypress/reports/TEST-cypress-[hash].xml",
+               "toConsole": true,
+               "testCaseSwitchClassnameAndName": true
        }
 }
index 22eb88c..048836e 100644 (file)
@@ -1,11 +1,12 @@
 ///<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';
+import {JsonBuilder} from '../../support/jsonBuilders/jsonBuilder';
+import {ServiceModel} from '../../support/jsonBuilders/models/service.model';
+import * as _ from 'lodash';
 
 describe('A la carte', function () {
   describe('check service name', () => {
-    var jsonBuilderAAIService : JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+    let jsonBuilderAAIService: JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
 
 
     beforeEach(() => {
@@ -21,52 +22,235 @@ describe('A la carte', function () {
       });
     });
 
+    afterEach(() => {
+      cy.screenshot();
+    });
+
     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';
+    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 () {
+    it(`service name should be mandatory : serviceEcompNaming = true`, ()=> {
       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);
+          changeServiceEcompNamingToTrue);
+        checkServiceNameInputIdMandatory();
+      });
+    });
+
+    it(`Service a-la-carte`, ()=> {
+
+      const subscriptionServiceType : string = "TYLER SILVIA";
+      const owningEntityName : string = "WayneHolland";
+      const rollbackOnFailure : string = "true";
+      const projectName : string = "WATKINS";
+      const instanceName : string = "serviceInstanceName";
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res) => {
+
+        cy.setTestApiParamToGR();
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].service.instantiationType = 'A-La-Carte';
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].service.inputs = null;
+        cy.setReduxState(<any>res);
+        cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+
+        cy.getElementByDataTestsId("openMenuBtn").click({force: true})
+          .getElementByDataTestsId("context-menu-header-edit-item").click({force: true})
+          .getElementByDataTestsId("instanceName")
+          .getElementByDataTestsId("subscriberName")
+          .getElementByDataTestsId("serviceType")
+          .getElementByDataTestsId("owningEntity")
+          .getElementByDataTestsId("project")
+          .getElementByDataTestsId("rollback");
+
+        cy.selectDropdownOptionByText("subscriberName", "SILVIA ROBBINS");
+        cy.selectDropdownOptionByText("serviceType", subscriptionServiceType);
+        cy.selectDropdownOptionByText("owningEntity", owningEntityName);
+        cy.selectDropdownOptionByText("rollback", rollbackOnFailure);
+        cy.selectDropdownOptionByText("project", projectName);
+        cy.typeToInput("instanceName", instanceName);
+
+        cy.get('#quantity-select').should('have.attr', 'disabled');
+        cy.getElementByDataTestsId('form-set').click({force: true}).then(() => {
+          cy.getReduxState().then((state) => {
+            const service = state.service.serviceInstance['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'];
 
-          checkServiceNameInputIdMandatory();
+            cy.readFile('../vid-automation/src/test/resources/a-la-carte/redux-a-la-carte.json').then((file) => {
+              expect(service.subscriptionServiceType).to.equals(subscriptionServiceType);
+              expect(service.owningEntityName).to.equals(owningEntityName);
+              expect(service.rollbackOnFailure).to.equals(rollbackOnFailure);
+              expect(service.projectName).to.equals(projectName);
+              expect(service.instanceName).to.equals(instanceName);
+            });
+          });
+        });
       });
     });
 
-    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();
+
+    it(`VNF a-la-carte`, ()=> {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res) => {
+        cy.setTestApiParamToGR();
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].service.instantiationType = 'A-La-Carte';
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].service.inputs = null;
+        cy.setReduxState(<any>res);
+        cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+
+        cy.getElementByDataTestsId("openMenuBtn").click({force: true})
+          .getElementByDataTestsId("context-menu-header-edit-item").click({force: true})
+          .getElementByDataTestsId("instanceName")
+          .getElementByDataTestsId("subscriberName")
+          .getElementByDataTestsId("serviceType")
+          .getElementByDataTestsId("owningEntity")
+          .getElementByDataTestsId("project")
+          .getElementByDataTestsId("rollback");
+
+        cy.selectDropdownOptionByText("subscriberName", "SILVIA ROBBINS");
+        cy.selectDropdownOptionByText("serviceType", "TYLER SILVIA");
+        cy.selectDropdownOptionByText("owningEntity", "WayneHolland");
+        cy.selectDropdownOptionByText("rollback", "true");
+        cy.selectDropdownOptionByText("project", "WATKINS");
+        cy.typeToInput("instanceName", "serviceInstanceName");
+
+        cy.get('#quantity-select').should('have.attr', 'disabled');
+        cy.getElementByDataTestsId('form-set').click({force: true}).then(() => {
+          cy.getElementByDataTestsId('node-2017-488_ADIOD-vPE 0-add-btn').click({force: true}).then(() => {
+            cy.selectDropdownOptionByText('productFamily', 'Emanuel');
+            cy.selectDropdownOptionByText('lcpRegion', 'JANET25');
+            cy.typeToInput("lcpRegionText", "just another region");
+            cy.selectDropdownOptionByText('tenant', 'USP-SIP-IC-24335-T-01');
+            cy.selectDropdownOptionByText('lineOfBusiness', 'zzz1');
+            cy.selectDropdownOptionByText('platform', 'xxx1');
+            cy.getElementByDataTestsId('form-set').click({force: true}).then(() => {
+              cy.getReduxState().then((state) => {
+
+                const vnf = state.service.serviceInstance['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].vnfs['2017-488_ADIOD-vPE 0'];
+
+                cy.readFile('../vid-automation/src/test/resources/a-la-carte/redux-a-la-carte.json').then((file) => {
+                  file.vnfs['2017-488_ADIOD-vPE 0'].trackById = vnf.trackById;
+                  file.vnfs['2017-488_ADIOD-vPE 0'].vfModules = {};
+                  cy.deepCompare(vnf, file.vnfs['2017-488_ADIOD-vPE 0'])
+                });
+              });
+            });
+
+          });
+        });
       });
     });
 
-    function changeServiceEcompNamingToTrue(obj : ServiceModel){
-      obj.service.serviceEcompNaming = "true";
-      return obj;
-    }
+    it(`Network a-la-carte`, ()=> {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res) => {
+        cy.setTestApiParamToGR();
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].service.instantiationType = 'A-La-Carte';
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].service.inputs = null;
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].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}}",
+              "ecomp_generated_naming": "false",
+              "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"
+          }
+        };
+        res.service.serviceInstance['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].networks = {};
+        cy.setReduxState(<any>res);
+        cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+        cy.getElementByDataTestsId("node-ExtVL 0-add-btn").click({force: true});
+        cy.selectDropdownOptionByText("platform", "xxx1");
+        cy.selectDropdownOptionByText("lcpRegion", "JANET25");
+        cy.selectDropdownOptionByText("tenant", "USP-SIP-IC-24335-T-01");
+        cy.selectDropdownOptionByText("productFamily", "SCOTTIE");
+        cy.selectDropdownOptionByText("lineOfBusiness", "zzz1");
+        cy.typeToInput("lcpRegionText", "lcpRegionText");
+
+        cy.getElementByDataTestsId('form-set').click({force: true}).then(() => {
+          cy.getReduxState().then((state) => {
+            const network = state.service.serviceInstance['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].networks['ExtVL 0'];
+
+            cy.readFile('../vid-automation/src/test/resources/a-la-carte/redux-a-la-carte.json').then((file) => {
+              file.networks['ExtVL 0'].trackById = network.trackById;
+              cy.deepCompare(network, file.networks['ExtVL 0']);
+            });
+          });
+        });
+      });
+    });
+
+    it(`VFModule a-la-carte`, ()=> {
+      var timeBomb = new Date('12/09/2018');
+      if (new Date() < timeBomb) {
+        return;
+      }
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res) => {
+        cy.setTestApiParamToGR();
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].service.instantiationType = 'A-La-Carte';
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].service.inputs = null;
+        cy.setReduxState(<any>res);
+        cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
 
-    function changeServiceEcompNamingToFalse(obj : ServiceModel){
-      obj.service.serviceEcompNaming = "false";
+        cy.getElementByDataTestsId('node-2017-488_ADIOD-vPE 0-add-btn').click({force: true}).then(() => {
+          cy.selectDropdownOptionByText('productFamily', 'Emanuel');
+          cy.selectDropdownOptionByText('lcpRegion', 'hvf6');
+          cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-STTest2');
+          cy.selectDropdownOptionByText('lineOfBusiness', 'zzz1');
+          cy.selectDropdownOptionByText('platform', 'xxx1');
+          cy.getElementByDataTestsId('form-set').click({force: true}).then(() => {
+            const vnfName = '2017-488_ADIOD-vPE 0';
+            let vfModulesNames: Array<string> = [
+              '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0',
+              '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1',
+              '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
+            ];
+
+            addVfModule(vnfName, vfModulesNames[0], 'mimazepubi', 'hvf6', '', 'AINWebTool-15-D-iftach', false, false, false)
+              .then(() => {
+                addVfModule(vnfName, vfModulesNames[1], 'puwesovabe', 'JANET25', 'my region', 'USP-SIP-IC-24335-T-01', true, true, false)
+                  .then(() => {
+                    addVfModule(vnfName, vfModulesNames[2], 'bnmgtrx', 'hvf6', '', 'AINWebTool-15-D-iftach', false, false, true)
+                      .then(() => {
+                        cy.getReduxState().then((state) => {
+                          const vfModules = state.service.serviceInstance['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].vnfs[vnfName].vfModules;
+                          cy.readFile('../vid-automation/src/test/resources/a-la-carte/redux-a-la-carte.json').then((file) => {
+                            for (let vfModulesName of vfModulesNames) {
+                              const vfModule = vfModules[vfModulesName];
+                              let vfModuleObject = vfModule[Object.keys(vfModule)[0]];
+                              cy.deepCompare(vfModuleObject, file.vnfs[vnfName].vfModules[vfModulesName][vfModulesName]);
+                            }
+                          });
+                        });
+                      });
+                  });
+              });
+          });
+        });
+      });
+    });
+
+
+    function changeServiceEcompNamingToTrue(obj: ServiceModel) {
+      obj.service.serviceEcompNaming = "true";
       return obj;
     }
 
-    function checkServiceNameInputIdMandatory(){
+    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})
@@ -76,5 +260,29 @@ describe('A la carte', function () {
       cy.getElementByDataTestsId(CONFIRM_BUTTON).click({force: true})
         .get('.error').contains(INSTANCE_NAME_NOT_MANDATORY_MESSAGE);
     }
+
+    function addVfModule(vnfName: string, vfModuleName: string, instanceName: string, lcpRegion: string, legacyRegion: string, tenant: string, rollback: boolean, sdncPreLoad: boolean, deleteVgName: boolean): Chainable<any> {
+      return cy.getElementByDataTestsId('node-' + vnfName).click({force: true}).then(() => {
+        cy.getElementByDataTestsId('node-' + vfModuleName + '-add-btn').click({force: true}).then(() => {
+          cy.getElementByDataTestsId('instanceName').clear().type(instanceName, {force: true}).then(() => {
+            if (deleteVgName) {
+              cy.getElementByDataTestsId('volumeGroupName').clear();
+            }
+          }).then(() => {
+            cy.selectDropdownOptionByText('lcpRegion', lcpRegion);
+            if (!_.isEmpty(legacyRegion)) {
+              cy.typeToInput("lcpRegionText", legacyRegion);
+            }
+            cy.selectDropdownOptionByText('tenant', tenant);
+            cy.selectDropdownOptionByText('rollback', String(rollback));
+            if (sdncPreLoad) {
+              cy.getElementByDataTestsId('sdncPreLoad').check();
+            }
+            cy.getElementByDataTestsId('form-set').click({force: true});
+          });
+        });
+      });
+    }
+
   });
 });
index c915d48..f0db2c9 100644 (file)
@@ -1,10 +1,13 @@
 ///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
-import { JsonBuilder } from '../../support/jsonBuilders/jsonBuilder';
-import { AsyncInstantiationModel } from '../../support/jsonBuilders/models/asyncInstantiation.model';
+import {JsonBuilder} from '../../support/jsonBuilders/jsonBuilder';
+import {AsyncInstantiationModel} from '../../support/jsonBuilders/models/asyncInstantiation.model';
+import * as _ from 'lodash';
+import {ServiceModel} from "../../support/jsonBuilders/models/service.model";
 
 describe('Audit information modal', function () {
   describe('basic UI tests', () => {
-    var jsonBuilderInstantiationBuilder : JsonBuilder<AsyncInstantiationModel> = new JsonBuilder<AsyncInstantiationModel>();
+    var jsonBuilderInstantiationBuilder: JsonBuilder<AsyncInstantiationModel> = new JsonBuilder<AsyncInstantiationModel>();
+    var jsonBuilderAndMock: JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
     beforeEach(() => {
       cy.window().then((win) => {
         win.sessionStorage.clear();
@@ -14,24 +17,69 @@ describe('Audit information modal', function () {
           Cypress.config('baseUrl') + "/asyncInstantiation**");
         cy.initAAIMock();
         cy.initVidMock();
+        cy.initAsyncInstantiation();
         cy.login();
       })
     });
 
+    afterEach(() => {
+      cy.screenshot();
+    });
+
     it(`should display 2 tables with information's`, function () {
+      cy.initAuditInfoMSOALaCarte();
+      cy.openIframe('app/ui/#/instantiationStatus');
+      cy.get('.instantiation-status-data tbody tr').each(function (row, index) {
+        cy.get('.icon-menu').eq(index).click({force: true}).then(()=>{
+          cy.getElementByDataTestsId('context-menu-audit-info').click({force:true}).then(()=>{
+            cy.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({force:true});
+          })
+        });
+      });
+    });
+
+    it("shouldn't show instance name in mso table on macro service", function () {
+      cy.openIframe('app/ui/#/instantiationStatus');
+      cy.get('.icon-menu').eq(0).click({force:true}).then(() => {
+        cy.getElementByDataTestsId('context-menu-audit-info').click({force:true}).then(() => {
+          cy.get('#service-instantiation-audit-info-mso thead tr th#instanceName').should("not.be.visible")
+            .get('#service-instantiation-audit-info-mso tbody tr td.msoInstanceName').should("not.be.visible");
+        })
+      })
+    });
 
+    it('should show instance name in mso table on a la carte service', function () {
+      cy.readFile('../vid-automation/src/test/resources/a-la-carte/auditInfoMSOALaCarte.json').then((res) => {
+        cy.initAuditInfoMSOALaCarte(res);
         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();
+        cy.get('.icon-menu').eq(7).click({force:true}).then(() => {
+          cy.getElementByDataTestsId('context-menu-audit-info').click({force:true}).then(() => {
+            cy.get('#service-instantiation-audit-info-mso thead tr th#instanceName').should("be.visible")
+              .get('#service-instantiation-audit-info-mso tbody tr').each(function (row, index) {
+              assert.equal(row.find('.request-id').text().trim(), res[index]['requestId']);
+              assert.equal(row.find('.msoInstanceName').text().trim(), 'service: ' + res[index]['instanceName']);
+              assert.equal(row.find('#msoJobStatus').text().trim(), _.capitalize(res[index]['jobStatus']));
+              assert.equal(row.find('#msoAdditionalInfo span').text().trim(), res[index]['additionalInfo']);
+            });
+          });
+        })
+      })
+    });
+
+    it('glossary should be visible', function () {
+      cy.openIframe('app/ui/#/instantiationStatus');
+      cy.get('.icon-menu').eq(7).click().then(() => {
+        cy.getElementByDataTestsId('context-menu-audit-info').click().then(() => {
+          cy.get('#glossary_link').should('be.visible');
         });
+      })
     });
+
   });
 });
diff --git a/vid-webpack-master/cypress/integration/iFrames/browse-sdc.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/browse-sdc.e2e.ts
new file mode 100644 (file)
index 0000000..1e80ee7
--- /dev/null
@@ -0,0 +1,102 @@
+///<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('Browse SDC', function () {
+    var jsonBuilderAndMock : JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+
+
+    beforeEach(() => {
+      cy.window().then((win) => {
+        win.sessionStorage.clear();
+        cy.preventErrorsOnLoading();
+        cy.initAAIMock();
+        cy.initVidMock();
+        cy.initZones();
+        cy.login();
+        cy.visit("welcome.htm")
+      });
+    });
+
+    afterEach(() => {
+      cy.screenshot();
+    });
+
+    it(`browse sdc open macro with network and then macro for new flow`, function () {
+       // const MACRO_WITH_CONFIGURATION_ID: string = 'ee6d61be-4841-4f98-8f23-5de9da846ca7';
+      const MACRO_WITH_NETWORK_ID: string = "bd8ffd14-da36-4f62-813c-6716ba9f4354";
+      const MACRO_FOR_NEW_FLOW_ID: string = '74fa72dd-012b-49c3-800d-06b12bcaf1a0';
+      const CANCEL_BUTTON = "cancelButton";
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/bug616888/list-services.json').then((res) => {
+        jsonBuilderAndMock.basicJson(res,
+          Cypress.config('baseUrl') + '/rest/models/services?distributionStatus=DISTRIBUTED',
+          200,
+          0,
+          'list_services');
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/bug616888/service-with-configuration.json').then((res) => {
+        jsonBuilderAndMock.basicJson(res,
+          Cypress.config('baseUrl') + '/rest/models/services/' + MACRO_WITH_NETWORK_ID,
+          200,
+          0,
+          'MACRO_WITH_CONFIGURATION');
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/bug616888/Dror_service1806_Macro1.json').then((res) => {
+        jsonBuilderAndMock.basicJson(res,
+          Cypress.config('baseUrl') + '/rest/models/services/' + MACRO_FOR_NEW_FLOW_ID,
+          200,
+          0,
+          'MACRO_FOR_NEW_FLOW');
+      });
+
+      cy.get('span').contains('Browse ASDC Service Models').click({force: true});
+      cy.wait("@list_services").then(() => {
+        cy.getElementByDataTestsId('deploy-' + MACRO_WITH_NETWORK_ID).click({force: true})
+          .getElementByDataTestsId(CANCEL_BUTTON).click({force: true});
+        cy.getElementByDataTestsId('deploy-' + MACRO_FOR_NEW_FLOW_ID).click({force: true});
+        cy.get("iframe");
+      });
+
+      cy.visit("welcome.htm"); //relaod page to not break the following tests
+
+    });
+
+  it(`browse sdc of service without instantiationType open aLaCarte popup`, function () {
+    const VERY_OLD_SERVICE_UUID: string = "09c476c7-91ae-44b8-a731-04d8d8fa3695";
+    const TEST_MOCKS_PATH="/cypress/support/jsonBuilders/mocks/jsons/bug_aLaCarteServiceWrongPopup/";
+
+    const CANCEL_BUTTON = "cancelButton";
+
+    cy.readFile(TEST_MOCKS_PATH+'list-services.json').then((res) => {
+      jsonBuilderAndMock.basicJson(res,
+        Cypress.config('baseUrl') + '/rest/models/services?distributionStatus=DISTRIBUTED',
+        200,
+        0,
+        'list_services');
+    });
+
+    cy.readFile(TEST_MOCKS_PATH+'serviceWithoutInstantiationType.json').then((res) => {
+      jsonBuilderAndMock.basicJson(res,
+        Cypress.config('baseUrl') + '/rest/models/services/' + VERY_OLD_SERVICE_UUID,
+        200,
+        0,
+        'MACRO_WITH_CONFIGURATION');
+    });
+
+    cy.get('span').contains('Browse ASDC Service Models').click({force: true});
+    cy.wait("@list_services").then(() => {
+      cy.getElementByDataTestsId('deploy-' + VERY_OLD_SERVICE_UUID).click({force: true})
+        .getElementByDataTestsId('create-modal-title').contains("Create Service Instance -- a la carte");
+    });
+
+    cy.visit("welcome.htm"); //relaod page to not break the following tests
+
+  });
+
+
+
+});
index 2f98ba8..d95cb8c 100644 (file)
+
 ///<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();
+    });
+  });
+
+  afterEach(() => {
+    cy.screenshot();
+  });
+
+  describe('duplicate', () => {
 
-    beforeEach(() => {
-      cy.window().then((win) => {
-        win.sessionStorage.clear();
-        cy.setReduxState();
-        cy.preventErrorsOnLoading();
-        cy.initAAIMock();
-        cy.initVidMock();
-        cy.login();
+    it('delete vf module reduce the number of vf modules ', 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.drawingBoardPressAddButtonByElementName('node-2017-488_ADIOD-vPE 0').get('i').should('have.class', 'fa-plus-circle');
+        cy.drawingBoardPressAddButtonByElementName('node-2017-488_ADIOD-vPE 0').click({force: true});
+        cy.fillVnfPopup().then(() => {
+          cy.drawingBoardPressAddButtonByElementName('node-2017-488_ADIOD-vPE 0').click({force: true});
+          cy.fillVnfPopup().then(() => {
+            cy.drawingBoardNumberOfExistingElementsShouldContains(2);
+            cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0', 1)
+              .drawingBoardTreeClickOnContextMenuOptionByName('Remove');
+            cy.drawingBoardNumberOfExistingElementsShouldContains(1);
+          });
+        })
       });
     });
 
+    it('create new  vf module  update the number of vf modules ', () => {
+      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.drawingBoardPressAddButtonByElementName('node-2017-488_ADIOD-vPE 0').get('i').should('have.class', 'fa-plus-circle');
+        cy.drawingBoardPressAddButtonByElementName('node-2017-488_ADIOD-vPE 0').click({force: true});
+        cy.fillVnfPopup().then(() => {
+          cy.drawingBoardPressAddButtonByElementName('node-2017-488_ADIOD-vPE 0').click({force: true});
+          cy.fillVnfPopup().then(() => {
+            cy.drawingBoardPressAddButtonByElementName('node-2017-488_ADIOD-vPE 0').click({force: true});
+            cy.fillVnfPopup().then(() => {
+              cy.drawingBoardNumberOfExistingElementsShouldContains(3);
+            });
+          });
+        });
+      });
+    });
 
-    it('should display service model name', function () {
+    it('duplicate vnf multi - should update number of vf modules on left side and disable duplicate when created max', () => {
       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');
+        cy.drawingBoardPressAddButtonByElementName('node-2017-488_ADIOD-vPE 0').get('i').should('have.class', 'fa-plus-circle')
+          .drawingBoardPressAddButtonByElementName('node-2017-488_ADIOD-vPE 0').click({force: true});
+        cy.fillVnfPopup().then(() => {
+          cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0')
+            .drawingBoardTreeClickOnContextMenuOptionByName('Duplicate')
+            .get('.quantity-select option').should('have.length', 9)
+            .getElementByDataTestsId('duplicate-amount-vfmodules').select('4')
+            .getTagElementContainsText('button', 'Duplicate').click({force: true});
+          cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0', 2)
+            .drawingBoardTreeClickOnContextMenuOptionByName('Duplicate')
+            .get('.quantity-select option').should('have.length', 5)
+            .getElementByDataTestsId('duplicate-amount-vfmodules').select('5')
+            .getTagElementContainsText('button', 'Duplicate').click({force: true});
+          cy.getElementByDataTestsId('node-2017-488_ADIOD-vPE 0').get("span").should('have.class', 'icon-v ng-star-inserted');
+          cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0', 9)
+            .get('ul.dropdown-menu li:nth-child(2)').should('have.class', 'disabled');
+          // close menu
+          cy.get('body').click();
+          cy.drawingBoardNumberOfExistingElementsShouldContains(10);
+          cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0', 1)
+            .drawingBoardTreeClickOnContextMenuOptionByName('Remove');
+          cy.drawingBoardNumberOfExistingElementsShouldContains(9);
+          cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0', 3)
+            .get('ul.dropdown-menu li:nth-child(2)').should('not.have.class', 'disabled');
+        })
+      });
+    });
+
+    it('cancel duplicate multi vnf - shouldn\'t duplicate', () => {
+      let res = getReduxWithVNFS(true);
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=6e59c5de-f052-46fa-aa7e-2fca9d674c44');
+      const vnfNode = 'node-d6557200-ecf2-4641-8094-5393ae3aae60-VF_vMee 0';
+      cy.getElementByDataTestsId(vnfNode).should('have.length', 1)
+        .drawingBoardTreeOpenContextMenuByElementDataTestId(vnfNode)
+        .drawingBoardTreeClickOnContextMenuOptionByName('Duplicate')
+        .getElementByDataTestsId('duplicate-amount-vfmodules').select('5')
+        .getTagElementContainsText('button', 'Cancel').click({force: true})
+        .getElementByDataTestsId(vnfNode).should('have.length', 1);
+    });
+
+    it('service with 2 network - can add unlimited number of network instances', () => {
+      let res = getReduxWith2Networks();
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2ab1da67-39cc-425f-ba52-59a64d0ea04a');
+      cy.get('drawing-board-tree tree-node-content').should('have.have.length', 1);
+
+      addNetworkFromModel('node-SR-IOV Provider 2-1').then(() => {
+      });
+    });
+
+    it('duplicate vnf macro', () => {
+      let res = getReduxWithVNFS(true);
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=6e59c5de-f052-46fa-aa7e-2fca9d674c44');
+      const vnfNode = 'node-d6557200-ecf2-4641-8094-5393ae3aae60-VF_vMee 0';
+      const vfModuleNode = 'node-522159d5-d6e0-4c2a-aa44-5a542a12a830-vf_vmee0..VfVmee..vmme_vlc..module-1';
+      cy.duplicateVnf(vnfNode, 1);
+      //edit the second vnf lineOfBusiness to be ECOMP
+      editSecondVnf(vnfNode);
+      assertEditvfModuleShowFile(vfModuleNode, "sample.json");
+      //assert that each vnf has it's own lineOfBusiness
+      cy.getReduxState().then((state) => {
+        const serviceInstance = state.service.serviceInstance['6e59c5de-f052-46fa-aa7e-2fca9d674c44'];
+        chai.expect(serviceInstance.vnfs['VF_vMee 0'].lineOfBusiness).equal("zzz1");
+        chai.expect(serviceInstance.vnfs['VF_vMee 0:0001'].lineOfBusiness).equal("ONAP");
       });
     });
 
-    it('should display icon and message if no vnf and vnfModules', function () {
+    it('delete duplicate vnf ', () => {
+      let res = getReduxWith2VNFS();
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=f4d84bb4-a416-4b4e-997e-0059973630b9');
+      cy.getElementByDataTestsId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0').should('have.length', 2);
+
+      cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0', 1)
+        .drawingBoardTreeClickOnContextMenuOptionByName('Duplicate')
+        .getTagElementContainsText('button', 'Duplicate').click({force: true})
+        .get('#drawing-board-tree .toggle-children').should('have.length', 1);
+
+      cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0', 2)
+        .drawingBoardTreeClickOnContextMenuOptionByName('Duplicate')
+        .getElementByDataTestsId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0').should('have.length', 3);
+    });
+
+    it('check the instanceParams set to instance ', () => {
+      let res = getReduxWith2VNFS();
+      let instanceName = "InstanceName";
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=f4d84bb4-a416-4b4e-997e-0059973630b9');
+      cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0', 1)
+        .drawingBoardTreeClickOnContextMenuOptionByName('Edit')
+        .getElementByDataTestsId('instanceName').type(instanceName)
+        .genericFormSubmitForm();
+
+      checkDynamicInputs();
+
+      cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0', 1)
+        .drawingBoardTreeClickOnContextMenuOptionByName('Edit');
+      cy.getElementByDataTestsId('instanceName').should('have.value', instanceName);
+      checkDynamicInputs();
+
+    });
+
+    it('delete duplicate vfModule ', () => {
+      let res = getReduxWith2VNFS();
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=f4d84bb4-a416-4b4e-997e-0059973630b9');
+      cy.getElementByDataTestsId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0').should('have.length', 2)
+        .drawingBoardTreeOpenContextMenuByElementDataTestId('node-040e591e-5d30-4e0d-850f-7266e5a8e013-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0')
+        .drawingBoardTreeClickOnContextMenuOptionByName('Remove')
+        .getElementByDataTestsId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0').should('have.length', 2);
+    });
+
+    it('duplicate unique vnf ', () => {
+      let res = getReduxWith2VNFS();
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=f4d84bb4-a416-4b4e-997e-0059973630b9');
+      cy.getElementByDataTestsId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0').should('have.length', 2)
+        .drawingBoardTreeOpenContextMenuByElementDataTestId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0', 1)
+        .drawingBoardTreeClickOnContextMenuOptionByName('Duplicate')
+        .getTagElementContainsText('button', 'Duplicate').click({force: true})
+        .get('#drawing-board-tree .toggle-children').should('have.length', 1);
+    });
+
+    it('duplicate a-la-carte vnf + networks', () => {
+      let res = getReduxWithVNFS(false);
+      cy.setTestApiParamToGR();
+
+      res.service.serviceHierarchy['6e59c5de-f052-46fa-aa7e-2fca9d674c44'].service.instantiationType = "A-La-Carte";
+
+      //remove VfModules since they are not fit to a-la-carte scenario
+      delete res.service.serviceHierarchy['6e59c5de-f052-46fa-aa7e-2fca9d674c44'].vnfs['VF_vMee 0'].vfModules;
+      delete res.service.serviceInstance['6e59c5de-f052-46fa-aa7e-2fca9d674c44'].vnfs['VF_vMee 0'].vfModules;
+
+      res.service.serviceInstance['6e59c5de-f052-46fa-aa7e-2fca9d674c44'].vnfs['VF_vMee 0'].instanceName = "VFvMee00001";
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=6e59c5de-f052-46fa-aa7e-2fca9d674c44');
+      const vnfNode = 'node-d6557200-ecf2-4641-8094-5393ae3aae60-VF_vMee 0';
+      cy.duplicateVnf(vnfNode, 1);
+
+      //edit the second vnf lineOfBusiness to be ECOMP
+      editSecondVnf(vnfNode);
+      cy.drawingBoardPressAddButtonByElementName("node-ExtVL 0").click({force: true}).then(() => {
+        cy.fillNetworkPopup();
+      });
+
+      // compare state with the json file
+      cy.getReduxState().then((state) => {
+        let serviceInstance = state.service.serviceInstance['6e59c5de-f052-46fa-aa7e-2fca9d674c44'];
+        //assert that each vnf has it's own lineOfBusiness
+        chai.expect(serviceInstance.vnfs['VF_vMee 0'].lineOfBusiness).equal("zzz1");
+        chai.expect(serviceInstance.vnfs['VF_vMee 0:0001'].lineOfBusiness).equal("ONAP");
+        cy.readFile('../vid-automation/src/test/resources/a-la-carte/redux-multiple-vnf-network.json').then((file) => {
+          const vnfs = file.vnfs;
+          var vnfNames = Object.keys(vnfs);
+
+          for (var i: number = 0; i < vnfNames.length; i++) {
+            chai.expect(serviceInstance.vnfs).to.have.any.keys(vnfNames[i]);
+          }
+
+          chai.expect(serviceInstance.vnfs['VF_vMee 0'].lineOfBusiness).equal(vnfs['VF_vMee 0'].lineOfBusiness);
+          chai.expect(serviceInstance.vnfs['VF_vMee 0'].instanceName).equal(vnfs['VF_vMee 0'].instanceName);
+
+          vnfs['VF_vMee 0:0001'].trackById = serviceInstance.vnfs['VF_vMee 0:0001'].trackById;
+
+          cy.deepCompare(serviceInstance.vnfs['VF_vMee 0:0001'], vnfs['VF_vMee 0:0001']);
+          cy.deepCompare(serviceInstance.vnfs['VF_vMee 0'], vnfs['VF_vMee 0']);
+
+          const network = serviceInstance.networks['ExtVL 0'];
+
+          file.networks['ExtVL 0'].trackById = network.trackById;
+          cy.deepCompare(network, file.networks['ExtVL 0']);
+        });
+      });
+    });
+
+  });
+
+  describe('multiple tests', () => {
+    it('remove vfModule with missing data should update deploy button status', () => {
+      let res = getReduxWithVFModuleMissingData();
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=f4d84bb4-a416-4b4e-997e-0059973630b9');
+      cy.getElementByDataTestsId('node-040e591e-5d30-4e0d-850f-7266e5a8e013-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0-alert-icon').should('have.class', 'icon-alert')
+        .drawingBoardTreeOpenContextMenuByElementDataTestId('node-040e591e-5d30-4e0d-850f-7266e5a8e013-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0')
+        .drawingBoardTreeClickOnContextMenuOptionByName('Remove')
+        .getElementByDataTestsId('deployBtn').should('not.have.attr', 'disabled');
+
+      cy.updateServiceShouldNotOverrideChild();
+    });
+
+    it('remove VNF with missing data should update deploy button status ', () => {
+      let res = getReduxWithVNFMissingData();
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=f4d84bb4-a416-4b4e-997e-0059973630b9');
+
+      cy.getElementByDataTestsId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0-alert-icon').should('have.class', 'icon-alert')
+        .drawingBoardTreeOpenContextMenuByElementDataTestId('node-ea81d6f7-0861-44a7-b7d5-d173b562c350-2017-488_ADIOD-vPE 0', 1)
+        .drawingBoardTreeClickOnContextMenuOptionByName('Remove')
+        .getTagElementContainsText('button', 'Remove VNF').click({force: true})
+        .getElementByDataTestsId('deployBtn').should('not.have.attr', 'disabled');
+      cy.updateServiceShouldNotOverrideChild();
+    });
+
+    xit('should display service model name', () => {
       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', () => {
+      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("text-title").contains("Please add objects (VNFs, network, modules etc.)");
+        cy.getElementByDataTestsId("text-title2").contains("from the left tree to design the service instance");
+        cy.getElementByDataTestsId("text-subtitle").contains("Once done, click Deploy to start instantiation");
         cy.get('#not-node-img-id').and('be.visible');
+        cy.getElementByDataTestsId("no-content-icon").should('have.class', "no-content-icon");
+        cy.getElementByDataTestsId("no-content-icon").should('have.class', "upload-icon-service-planing");
+        cy.getElementByDataTestsId("no-content-icon").should('have.attr', "src", "./assets/img/UPLOAD.svg");
       });
     });
 
-    it('should show alert on remove vnf with modules', function () {
+    it('should show alert on remove vnf with modules', () => {
       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});
+        cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0');
         // 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.drawingBoardTreeClickOnContextMenuOptionByName('Remove');
+
         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');
+        cy.updateServiceShouldNotOverrideChild();
       });
     });
 
-    it('should not show alert on remove vnf without modules', function () {
+    it('should not show alert on remove vnf without modules', () => {
       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();
+        cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-0903e1c0-8e03-4936-b5c2-260653b96413-2017-388_ADIOD-vPE 1');
+        cy.drawingBoardTreeClickOnContextMenuOptionByName('Remove')
       });
     });
 
-    it('should show <Automatically Assigned> if ecomp is true', function () {
+    it('should show <Automatically Assigned> if ecomp is true', () => {
       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.drawingBoardPressAddButtonByElementName('node-2017-388_ADIOD-vPE 0').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('lcpRegion', 'hvf6');
+        cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-testalexandria');
+        cy.selectDropdownOptionByText('lineOfBusiness', 'ONAP');
         cy.selectDropdownOptionByText('platform', 'platform');
+        cy.genericFormSubmitForm();
 
-        cy.getElementByDataTestsId('vnf-form-set').click({force: true});
-
-        cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').contains('<Automatically Assigned>');
+        cy.getElementByDataTestsId('node-afacccf6-397d-45d6-b5ae-94c39734b168-2017-388_ADIOD-vPE 0').contains('<Automatically Assigned>');
+        cy.updateServiceShouldNotOverrideChild();
       });
     });
 
-    it('should show model nameif ecomp is false', function () {
-      const vnfModelName: string = '2017-488_ADIOD-vPE 0';
+    it('should show model name if ecomp is false', () => {
+      const vnfModelKey: string = '2017-488_ADIOD-vPE 0',
+        vnfModelName: string = '2017-488_ADIOD-vPE';
       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';
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].vnfs[vnfModelKey].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.drawingBoardPressAddButtonByElementName('node-2017-488_ADIOD-vPE 0').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('lcpRegion', 'hvf6');
+        cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-testalexandria');
+        cy.selectDropdownOptionByText('lineOfBusiness', 'ONAP');
         cy.selectDropdownOptionByText('platform', 'platform');
-
-        cy.getElementByDataTestsId('vnf-form-set').click({force: true});
+        cy.genericFormSubmitForm();
 
         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');
-    //     });
-    //
-    //   });
-    //
-    // });
+    describe('add instance open a popup', () => {
+
+      it('should add vfModule with popup with empty required instance name', () => {
+        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"].properties.ecomp_generated_naming = "false";
+          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.drawingBoardPressAddButtonByElementName('node-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1').click({force: true});
+        });
+      });
+
+      it('should add vfModule with popup if empty required dynamic input', () => {
+        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.drawingBoardPressAddButtonByElementName('node-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1').click({force: true});
+          cy.get('#instance-popup').and('be.visible');
+        });
+      });
+
+    });
+
+
+    describe('show warning and disable deploy button on vnf missing data', () => {
+      it('show warning on vnf, and disable button, remove warning and enable button after edit', () => {
+        cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/serviceWithVnfAndVfModules.json').then((res) => {
+          res.service.serviceInstance['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].existingVNFCounterMap['0903e1c0-8e03-4936-b5c2-260653b96413'] = 1;
+          res.service.serviceInstance["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].validationCounter = 1;
+          res.service.serviceInstance["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].vnfs["2017-388_ADIOD-vPE 1"] = {
+            "rollbackOnFailure": "false",
+            "vfModules": {},
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "lcpCloudRegionId": "",
+            "tenantId": "",
+            "lineOfBusiness": "zzz1",
+            "platformName": "platform",
+            "isMissingData": true,
+            "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"
+            }
+          };
+          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-alert-icon").and('be.visible');
+          cy.isElementContainsAttr('deployBtn', 'disabled');
+          cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-0903e1c0-8e03-4936-b5c2-260653b96413-2017-388_ADIOD-vPE 1')
+            .drawingBoardTreeClickOnContextMenuOptionByName('Edit')
+          cy.selectDropdownOptionByText('lcpRegion', 'hvf6');
+          cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-testalexandria');
+          cy.genericFormSubmitForm();
+          cy.getElementByDataTestsId("node-0903e1c0-8e03-4936-b5c2-260653b96413-2017-388_ADIOD-vPE 1-alert-icon").should('not.be.visible');
+          cy.getElementByDataTestsId('deployBtn').should('not.have.attr', 'disabled');
+          cy.updateServiceShouldNotOverrideChild();
+        });
+      });
+    });
+
+    describe('vnf should automatically displayed or not according its min value and its vf-modules min value', () => {
+
+      it('vnf with min_instances value > 0 without required VF modules, should be created automatically without children', () => {
+        cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicRedux.json').then((res) => {
+          res.service.serviceHierarchy["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].vnfs["2017-488_ADIOD-vPE 0"].properties['min_instances'] = 1;
+          res.service.serviceHierarchy["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].vnfs["2017-488_ADIOD-vPE 0"].vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"].properties['initialCount'] = 0;
+          res.service.serviceHierarchy["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"].properties['initialCount'] = 0;
+          cy.setReduxState(<any>res);
+          cy.fillServicePopup().then(() => {
+            cy.visit("welcome.htm").then(() => {
+              cy.visit('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd').then(() => {
+                cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').should('exist');
+                cy.getElementByDataTestsId('node-25284168-24bb-4698-8cb4-3f509146eca5-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1').should('not.exist');
+                cy.getElementByDataTestsId('node-f8360508-3f17-4414-a2ed-6bc71161e8db-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0').should('not.exist');
+              })
+            })
+          });
+        });
+
+      });
+
+      it('vnf with min_instances value > 1 with required VF modules, should be created automatically with children only once', () => {
+        cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicRedux.json').then((res) => {
+          res.service.serviceHierarchy["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].vnfs["2017-488_ADIOD-vPE 0"].properties['min_instances'] = 3;
+          cy.setReduxState(<any>res);
+          cy.fillServicePopup().then(() => {
+            cy.visit("welcome.htm").then(() => {
+              cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+              cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').should('exist');
+              cy.getElementByDataTestsId('node-f8360508-3f17-4414-a2ed-6bc71161e8db-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0').should('have.length', 1);
+
+            });
+          });
+        });
+      });
+
+
+      it('vnf with min_instances value = 0 with required VF modules should be created automatically with its children', () => {
+        cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicRedux.json').then((res) => {
+          res.service.serviceHierarchy["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].vnfs["2017-488_ADIOD-vPE 0"].properties['min_instances'] = 0;
+          cy.setReduxState(<any>res);
+          cy.fillServicePopup().then(() => {
+            cy.visit("welcome.htm").then(() => {
+              cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+              cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').should('exist');
+              cy.getElementByDataTestsId('node-f8360508-3f17-4414-a2ed-6bc71161e8db-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0').should('exist');
+              cy.updateServiceShouldNotOverrideChild();
+            });
+          });
+        });
+
+      });
+
+
+      it('vnf without min_instances and without required VF modules, should not exist automatically in right side', () => {
+        cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicRedux.json').then((res) => {
+          cy.setReduxState(<any>res);
+          cy.fillServicePopup().then(() => {
+            cy.visit("welcome.htm").then(() => {
+              cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+              cy.getElementByDataTestsId('node-afacccf6-397d-45d6-b5ae-94c39734b168-2017-388_ADIOD-vPE 0').should('not.exist');
+            });
+          });
+        });
+      });
+    });
+  });
+
+  describe('supplementary file', () => {
+    it('delete file', () => {
+      let res = getReduxWithVNFS(true);
+      let instanceName = 'instanceName';
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=6e59c5de-f052-46fa-aa7e-2fca9d674c44');
+      const vfModuleNode = 'node-522159d5-d6e0-4c2a-aa44-5a542a12a830-vf_vmee0..VfVmee..vmme_vlc..module-1';
+      assertEditvfModuleShowFile(vfModuleNode, "sample.json");
+      cy.getElementByDataTestsId('remove-uploaded-file').click({force: true});
+      cy.getElementByDataTestsId('form-set').should('not.have.attr', 'disabled');
+      cy.typeToInput('instanceName', instanceName);
+      cy.genericFormSubmitForm();
+      cy.getReduxState().then((state) => {
+        const serviceInstance = state.service.serviceInstance['6e59c5de-f052-46fa-aa7e-2fca9d674c44'];
+        const vfModuleInstance = serviceInstance.vnfs['VF_vMee 0'].vfModules['vf_vmee0..VfVmee..vmme_vlc..module-1']['vf_vmee0..VfVmee..vmme_vlc..module-1dcudx'];
+        chai.expect(vfModuleInstance.supplementaryFile_hidden).to.be.null;
+        chai.expect(vfModuleInstance.supplementaryFile_hidden_content).to.be.null;
+        chai.expect(vfModuleInstance.supplementaryFileContent).to.be.undefined;
+        chai.expect(vfModuleInstance.supplementaryFileName).to.be.undefined;
+      });
+      cy.getElementByDataTestsId('node-d6557200-ecf2-4641-8094-5393ae3aae60-VF_vMee 0').click();
+      assertEditvfModuleShowFile(vfModuleNode, "Choose file");
+      cy.getElementByDataTestsId('instanceName').should('have.value', instanceName);
+    });
+  });
+
+  describe('component info', () => {
+
+    const longText = 'Im a very long text for verify wrapping so please dont make me shorter';
+
+    function testIfComponentInfoShown(flagState:boolean) {
+      let res = getReduxWith2VNFS();
+      res.global.flags.FLAG_1906_COMPONENT_INFO = flagState;
+      res.service.serviceHierarchy["f4d84bb4-a416-4b4e-997e-0059973630b9"].service.serviceRole = longText;
+      cy.setReduxState(<any>res);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=f4d84bb4-a416-4b4e-997e-0059973630b9');
+      let conditionStr = flagState ? "" : "not.";
+      cy.get('component-info').should(conditionStr+"be.visible");
+      const otherComponentWidth = flagState ? 5 : 6;
+      const otherComponentCss = 'col-md-'+otherComponentWidth ;
+      cy.get('available-models-tree').should("have.class", otherComponentCss);
+      cy.get('drawing-board-tree').should("have.class", otherComponentCss);
+      if (flagState) {
+        cy.get('component-info').should("have.class", 'col-md-2');
+      }
+
+
+    }
+
+    it('component info is shown and relevant fields are shown', () => {
+      testIfComponentInfoShown(true);
+
+      let labelsAndValues = [
+        ['Model Version', '1.0'],
+        ['Subscriber Name', 'SILVIA ROBBINS'],
+        ['Service Type', 'TYLER SILVIA'],
+        ['Service Role', longText]
+      ];
+      const expectedTitle = 'Service Instance INFO';
+      cy.assertComponentInfoTitleLabelsAndValues(expectedTitle, labelsAndValues);
+      cy.getElementByDataTestsId('model-item-value-Service Role').should('have.css', 'height', '32px'); //assert that long text is wrap
+    });
+
+    it('component info is not shown when feature flag is false', () => {
+      testIfComponentInfoShown(false);
+    });
   });
+
+
+  function addNetworkFromModel(instanceName: string) {
+    return cy.get('drawing-board-tree').find('tree-node-content').then((elemets) => {
+      cy.get('drawing-board-tree tree-node-content').should('have.have.length', elemets.length);
+      cy.drawingBoardPressAddButtonByElementName(instanceName).click({force: true}).then(() => {
+        cy.fillNetworkPopup();
+        cy.get('drawing-board-tree tree-node-content').should('have.have.length', (elemets.length + 1));
+        cy.updateServiceShouldNotOverrideChild();
+      });
+    });
+  }
+
+  function getReduxWith2VNFS() {
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true,
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+          "FLAG_ASYNC_JOBS": true,
+          "FLAG_1906_COMPONENT_INFO" : false
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": "Emanuel",
+              "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-egress_rule_application": "any",
+                  "sctp-b-ipv6-egress_src_start_port": "0",
+                  "Internal2_allow_transit": "true",
+                  "sctp-b-IPv6_ethertype": "IPv6",
+                  "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "sctp-b-ingress_rule_protocol": "icmp",
+                  "sctp-b-ingress_action": "pass",
+                  "sctp-a-egress_rule_application": "any",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "sctp-b-egress_src_addresses": "local",
+                  "fsb_volume_size_0": "320.0",
+                  "sctp-a-ipv6-ingress-dst_start_port": "0",
+                  "sctp-a-ipv6-ingress_ethertype": "IPv4",
+                  "sctp-b-ipv6-ingress_rule_application": "any",
+                  "domain_name": "default-domain",
+                  "sctp-a-egress_src_addresses": "local",
+                  "sctp-b-egress-src_start_port": "0.0",
+                  "sctp-a-ingress_rule_protocol": "icmp",
+                  "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+                  "sctp-b-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-a-ingress_ethertype": "IPv4",
+                  "sctp-a-egress-src_start_port": "0.0",
+                  "sctp-b-dst_subnet_prefix_v6": "::",
+                  "nf_naming": "{ecomp_generated_naming=false}",
+                  "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+                  "sctp-b-egress-dst_start_port": "0.0",
+                  "ncb_flavor_name": "nv.c20r64d1",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "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-egress_action": "pass",
+                  "sctp-b-ipv6-egress_rule_application": "any",
+                  "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+                  "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+                  "fsb_flavor_name": "nv.c20r64d1",
+                  "sctp_rule_protocol": "132",
+                  "sctp-a-ipv6-ingress_rule_application": "any",
+                  "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+                  "ecomp_generated_naming": "false",
+                  "sctp-a-IPv6_ethertype": "IPv6",
+                  "vlc_st_virtualization_type": "virtual-machine",
+                  "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "sctp-b-ingress-dst_end_port": "65535.0",
+                  "sctp-b-ingress-dst_start_port": "0.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",
+                  "vlc_flavor_name": "nd.c16r64d1",
+                  "int2_sec_group_name": "int2-sec-group",
+                  "sctp-b-ipv6-egress_src_addresses": "local",
+                  "vlc_st_interface_type_int1": "other1",
+                  "vlc_st_interface_type_int2": "other2",
+                  "sctp-a-ipv6-egress-dst_start_port": "0",
+                  "sctp-b-egress-src_end_port": "65535.0",
+                  "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+                  "Internal2_shared": "false",
+                  "sctp-a-ipv6-egress_rule_protocol": "any",
+                  "Internal2_rpf": "disable",
+                  "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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",
+                  "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "Internal2_forwarding_mode": "l2",
+                  "sctp-a-ipv6-egress_dst_end_port": "65535",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "sctp-a-ingress_dst_addresses": "local",
+                  "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+                  "sctp-a-egress_action": "pass",
+                  "fsb_volume_type_0": "SF-Default-SSD",
+                  "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_sctp_a": "left",
+                  "vlc_st_version": "2",
+                  "sctp-a-src_subnet_prefix_v6": "::",
+                  "vlc_st_interface_type_sctp_b": "right",
+                  "sctp-a-ingress_rule_application": "any",
+                  "sctp-b-egress_ethertype": "IPv4",
+                  "sctp-a-ipv6-egress_src_start_port": "0",
+                  "instance_ip_family_v6": "v6",
+                  "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "sctp-b-ingress-src_start_port": "0.0",
+                  "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "sctp-b-ingress_dst_addresses": "local",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "false",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "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-a-ipv6-ingress_dst_addresses": "local",
+                  "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+                  "sctp-b-ipv6-egress_action": "pass",
+                  "sctp-a-egress_rule_protocol": "icmp",
+                  "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-b-egress_rule_protocol": "icmp",
+                  "sctp-a-ingress_action": "pass",
+                  "sctp-b-ipv6-ingress_action": "pass",
+                  "vlc_st_service_type": "firewall",
+                  "sctp-b-ipv6-egress_dst_end_port": "65535",
+                  "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-dst_start_port": "0",
+                  "vlc_st_availability_zone": "true",
+                  "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+                  "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+                  "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+                  "gpb_flavor_name": "nv.c20r64d1",
+                  "Internal1_allow_transit": "true",
+                  "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-ingress_ethertype": "IPv4",
+                  "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+                  "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+                  "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress_action": "pass",
+                  "Internal1_rpf": "disable",
+                  "sctp-b-ingress_ethertype": "IPv4",
+                  "sctp-b-ingress-src_end_port": "65535.0",
+                  "sctp-b-egress_rule_application": "any",
+                  "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": {}
+          },
+          "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "availability_zone_0": {
+                    "type": "string",
+                    "description": "The Availability Zone to launch the instance.",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "mtpocfo-kvm-az01"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "2017488_adiodvpe0_bandwidth_units"
+                  },
+                  "bandwidth": {
+                    "displayName": "bandwidth",
+                    "command": "get_input",
+                    "inputName": "2017488_adiodvpe0_bandwidth"
+                  },
+                  "AIC_CLLI": {
+                    "displayName": "AIC_CLLI",
+                    "command": "get_input",
+                    "inputName": "2017488_adiodvpe0_AIC_CLLI"
+                  },
+                  "availability_zone_0": {
+                    "displayName": "availability_zone_0",
+                    "command": "get_input",
+                    "inputName": "2017488_adiodvpe0_availability_zone_0"
+                  },
+                  "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": {
+                  "max_instances": 10,
+                  "min_instances": 1,
+                  "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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "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.0.0.10",
+                  "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": {
+          "f4d84bb4-a416-4b4e-997e-0059973630b9": {
+            "vnfs": {
+              "2017-488_ADIOD-vPE 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0eknhp": {
+                      "modelInfo": {
+                        "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                        "modelVersionId": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+                        "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                        "modelVersion": "6",
+                        "modelCustomizationId": "5c5f91f9-5e31-4120-b892-5536587ec258",
+                        "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"
+                      },
+                      "isMissingData": false,
+                      "instanceParams": [
+                        {}
+                      ]
+                    }
+                  }
+                },
+                "isMissingData": false,
+                "originalName": null,
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "lineOfBusiness": "ONAP",
+                "platformName": "platform",
+                "modelInfo": {
+                  "modelInvariantId": "5be7e99e-8eb2-4d97-be63-8081ff3cd10e",
+                  "modelVersionId": "ea81d6f7-0861-44a7-b7d5-d173b562c350",
+                  "modelName": "2017-488_ADIOD-vPE",
+                  "modelVersion": "9.0",
+                  "modelCustomizationId": "41516cc6-5098-4b40-a619-f8d5f55fc4d8",
+                  "modelCustomizationName": "2017-488_ADIOD-vPE 0"
+                }
+              },
+              "2017-488_ADIOD-vPE 0:0001": {
+                "rollbackOnFailure": "true",
+                "vfModules": {},
+                "isMissingData": false,
+                "originalName": "2017-488_ADIOD-vPE 0",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "lineOfBusiness": "ONAP",
+                "platformName": "platform",
+                "modelInfo": {
+                  "modelInvariantId": "5be7e99e-8eb2-4d97-be63-8081ff3cd10e",
+                  "modelVersionId": "ea81d6f7-0861-44a7-b7d5-d173b562c350",
+                  "modelName": "2017-488_ADIOD-vPE",
+                  "modelVersion": "9.0",
+                  "modelCustomizationId": "41516cc6-5098-4b40-a619-f8d5f55fc4d8",
+                  "modelCustomizationName": "2017-488_ADIOD-vPE 0"
+                }
+              }
+            },
+            "instanceParams": [
+              {
+                "2017488_adiodvpe0_ASN": "AV_vPE"
+              }
+            ],
+            "validationCounter": 0,
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "aicZoneId": "JAG1",
+            "projectName": "x1",
+            "owningEntityId": "aaa1",
+            "rollbackOnFailure": "false",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "598e3f9e-3244-4d8f-a8e0-0e5d7a29eda9",
+              "modelVersionId": "f4d84bb4-a416-4b4e-997e-0059973630b9",
+              "modelName": "ADIOD vMX vPE_BV Service 488",
+              "modelVersion": "1.0"
+            },
+            "tenantName": "USP-SIP-IC-24335-T-01",
+            "existingVNFCounterMap": {
+              "41516cc6-5098-4b40-a619-f8d5f55fc4d8": 1
+            },
+            "existingNames": {},
+            "aicZoneName": "YUDFJULP-JAG1"
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [
+            {
+              "id": "JANET25",
+              "name": "JANET25",
+              "isPermitted": true
+            },
+            {
+              "id": "hvf6",
+              "name": "hvf6",
+              "isPermitted": true
+            }
+          ],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [
+              {
+                "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                "name": "USP-SIP-IC-24335-T-01",
+                "isPermitted": true
+              }
+            ],
+            "hvf6": [
+              {
+                "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "name": "AIN Web Tool-15-D-testalexandria",
+                "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-hvf6-09",
+                "isPermitted": true
+              },
+              {
+                "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                "name": "DN5242-Nov16-T3",
+                "isPermitted": true
+              }
+            ]
+          }
+        },
+        "subscribers": [
+          {
+            "id": "CAR_2020_ER",
+            "name": "CAR_2020_ER",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-2",
+            "name": "DALE BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-1",
+            "name": "LLOYD BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example",
+            "name": "JimmyExampleCust-20161102",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example2",
+            "name": "JimmyExampleCust-20161103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-102",
+            "name": "ERICA5779-TestSub-PWT-102",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-101",
+            "name": "ERICA5779-TestSub-PWT-101",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-4",
+            "name": "ERICA5779-Subscriber-5",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-103",
+            "name": "ERICA5779-TestSub-PWT-103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-2",
+            "name": "ERICA5779-Subscriber-2",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": true
+          },
+          {
+            "id": "ERICA5779-Subscriber-3",
+            "name": "ERICA5779-Subscriber-3",
+            "isPermitted": false
+          },
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          }
+        ],
+        "productFamilies": [
+          {
+            "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "name": "SCOTTIE",
+            "isPermitted": true
+          },
+          {
+            "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "name": "IGNACIO",
+            "isPermitted": true
+          },
+          {
+            "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "name": "Christie",
+            "isPermitted": true
+          },
+          {
+            "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+            "name": "Enhanced Services",
+            "isPermitted": true
+          },
+          {
+            "id": "vTerrance",
+            "name": "vTerrance",
+            "isPermitted": true
+          },
+          {
+            "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+            "name": "vSCP",
+            "isPermitted": true
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": true
+          },
+          {
+            "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+            "name": "BVOIP",
+            "isPermitted": true
+          },
+          {
+            "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+            "name": "LINDSEY",
+            "isPermitted": true
+          },
+          {
+            "id": "LRSI-OSPF",
+            "name": "LRSI-OSPF",
+            "isPermitted": true
+          },
+          {
+            "id": "vRosemarie",
+            "name": "HNGATEWAY",
+            "isPermitted": true
+          },
+          {
+            "id": "vHNPaas",
+            "name": "WILKINS",
+            "isPermitted": true
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "TYLER SILVIA",
+            "isPermitted": true
+          },
+          {
+            "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+            "name": "VROUTER",
+            "isPermitted": true
+          },
+          {
+            "id": "Cisneros",
+            "name": "vMuriel",
+            "isPermitted": true
+          },
+          {
+            "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+            "name": "CARA Griffin",
+            "isPermitted": true
+          },
+          {
+            "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          },
+          {
+            "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+            "name": "Transport",
+            "isPermitted": true
+          },
+          {
+            "id": "vSalvatore",
+            "name": "vSalvatore",
+            "isPermitted": true
+          },
+          {
+            "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+            "name": "Josefina",
+            "isPermitted": true
+          },
+          {
+            "id": "vHubbard",
+            "name": "vHubbard",
+            "isPermitted": true
+          },
+          {
+            "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          }
+        ],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [
+            {
+              "id": "0",
+              "name": "vRichardson",
+              "isPermitted": false
+            },
+            {
+              "id": "1",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "2",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "3",
+              "name": "vJamie",
+              "isPermitted": false
+            },
+            {
+              "id": "4",
+              "name": "vVoiceMail",
+              "isPermitted": false
+            },
+            {
+              "id": "5",
+              "name": "Kennedy",
+              "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": "LINDSEY",
+              "isPermitted": false
+            },
+            {
+              "id": "17",
+              "name": "JOHANNA_SANTOS",
+              "isPermitted": false
+            },
+            {
+              "id": "18",
+              "name": "vCarroll",
+              "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": "WayneHolland"
+            },
+            {
+              "id": "Melissa",
+              "name": "Melissa"
+            }
+          ],
+          "projectList": [
+            {
+              "id": "WATKINS",
+              "name": "WATKINS"
+            },
+            {
+              "id": "x1",
+              "name": "x1"
+            },
+            {
+              "id": "yyy1",
+              "name": "yyy1"
+            }
+          ],
+          "lineOfBusinessList": [
+            {
+              "id": "ONAP",
+              "name": "ONAP"
+            },
+            {
+              "id": "zzz1",
+              "name": "zzz1"
+            }
+          ],
+          "platformList": [
+            {
+              "id": "platform",
+              "name": "platform"
+            },
+            {
+              "id": "xxx1",
+              "name": "xxx1"
+            }
+          ]
+        },
+        "type": "[CATEGORY_PARAMETERS] Update"
+      }
+    }
+  }
+
+  function getReduxWithVNFMissingData() {
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "availability_zone_0": {
+                    "type": "string",
+                    "description": "The Availability Zone to launch the instance.",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "mtpocfo-kvm-az01"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "2017488_adiodvpe0_bandwidth_units"
+                  },
+                  "bandwidth": {
+                    "displayName": "bandwidth",
+                    "command": "get_input",
+                    "inputName": "2017488_adiodvpe0_bandwidth"
+                  },
+                  "AIC_CLLI": {
+                    "displayName": "AIC_CLLI",
+                    "command": "get_input",
+                    "inputName": "2017488_adiodvpe0_AIC_CLLI"
+                  },
+                  "availability_zone_0": {
+                    "displayName": "availability_zone_0",
+                    "command": "get_input",
+                    "inputName": "2017488_adiodvpe0_availability_zone_0"
+                  },
+                  "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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "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.0.0.10",
+                  "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": 2,
+                      "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": {}
+          },
+          "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": "Emanuel",
+              "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "false",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": {}
+          }
+        },
+        "serviceInstance": {
+          "f4d84bb4-a416-4b4e-997e-0059973630b9": {
+            "vnfs": {
+              "2017-488_ADIOD-vPE 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0jkyqv": {
+                      "isMissingData": false,
+                      "sdncPreReload": null,
+                      "modelInfo": {
+                        "modelType": "VFmodule",
+                        "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                        "modelVersionId": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+                        "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                        "modelVersion": "6",
+                        "modelCustomizationId": "5c5f91f9-5e31-4120-b892-5536587ec258",
+                        "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"
+                      },
+                      "instanceParams": [
+                        {}
+                      ],
+                      "trackById": "n2ydptuy9lj"
+                    }
+                  }
+                },
+                "isMissingData": false,
+                "originalName": null,
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": null,
+                "tenantId": null,
+                "lineOfBusiness": null,
+                "platformName": null,
+                "modelInfo": {
+                  "modelType": "VF",
+                  "modelInvariantId": "5be7e99e-8eb2-4d97-be63-8081ff3cd10e",
+                  "modelVersionId": "f4d84bb4-a416-4b4e-997e-0059973630b9",
+                  "modelName": "2017-488_ADIOD-vPE",
+                  "modelVersion": "9.0",
+                  "modelCustomizationName": "2017-488_ADIOD-vPE 0"
+                },
+                "trackById": "iapflwk8bip"
+              },
+              "2017-488_ADIOD-vPE 0:0001": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0jkyqv": {
+                      "isMissingData": false,
+                      "sdncPreReload": null,
+                      "modelInfo": {
+                        "modelType": "VFmodule",
+                        "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                        "modelVersionId": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+                        "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                        "modelVersion": "6",
+                        "modelCustomizationId": "5c5f91f9-5e31-4120-b892-5536587ec258",
+                        "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"
+                      },
+                      "instanceParams": [
+                        {}
+                      ],
+                      "trackById": "wh18xgy0dc"
+                    }
+                  }
+                },
+                "isMissingData": true,
+                "originalName": "2017-488_ADIOD-vPE 0",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": null,
+                "tenantId": null,
+                "lineOfBusiness": null,
+                "platformName": null,
+                "modelInfo": {
+                  "modelType": "VF",
+                  "modelInvariantId": "5be7e99e-8eb2-4d97-be63-8081ff3cd10e",
+                  "modelVersionId": "f4d84bb4-a416-4b4e-997e-0059973630b9",
+                  "modelName": "2017-488_ADIOD-vPE",
+                  "modelVersion": "9.0",
+                  "modelCustomizationName": "2017-488_ADIOD-vPE 0"
+                },
+                "trackById": "iapflwk8bip"
+              }
+            },
+            "instanceParams": [
+              {
+                "2017488_adiodvpe0_ASN": "AV_vPE"
+              }
+            ],
+            "validationCounter": 1,
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "aicZoneId": "JAG1",
+            "projectName": "x1",
+            "owningEntityId": "aaa1",
+            "rollbackOnFailure": "true",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "598e3f9e-3244-4d8f-a8e0-0e5d7a29eda9",
+              "modelVersionId": "f4d84bb4-a416-4b4e-997e-0059973630b9",
+              "modelName": "ADIOD vMX vPE_BV Service 488",
+              "modelVersion": "1.0"
+            },
+            "existingVNFCounterMap": {
+              "91415b44-753d-494c-926a-456a9172bbb9": 1
+            },
+            "existingNetworksCounterMap": {},
+            "tenantName": "USP-SIP-IC-24335-T-01",
+            "aicZoneName": "YUDFJULP-JAG1"
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [
+            {
+              "id": "JANET25",
+              "name": "JANET25",
+              "isPermitted": true
+            },
+            {
+              "id": "hvf6",
+              "name": "hvf6",
+              "isPermitted": true
+            }
+          ],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [
+              {
+                "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                "name": "USP-SIP-IC-24335-T-01",
+                "isPermitted": true
+              }
+            ],
+            "hvf6": [
+              {
+                "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "name": "AIN Web Tool-15-D-testalexandria",
+                "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-hvf6-09",
+                "isPermitted": true
+              },
+              {
+                "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                "name": "DN5242-Nov16-T3",
+                "isPermitted": true
+              }
+            ]
+          }
+        },
+        "subscribers": [
+          {
+            "id": "CAR_2020_ER",
+            "name": "CAR_2020_ER",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-2",
+            "name": "DALE BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-1",
+            "name": "LLOYD BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example",
+            "name": "JimmyExampleCust-20161102",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example2",
+            "name": "JimmyExampleCust-20161103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-102",
+            "name": "ERICA5779-TestSub-PWT-102",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-101",
+            "name": "ERICA5779-TestSub-PWT-101",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-4",
+            "name": "ERICA5779-Subscriber-5",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-103",
+            "name": "ERICA5779-TestSub-PWT-103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-2",
+            "name": "ERICA5779-Subscriber-2",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": true
+          },
+          {
+            "id": "ERICA5779-Subscriber-3",
+            "name": "ERICA5779-Subscriber-3",
+            "isPermitted": false
+          },
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          }
+        ],
+        "productFamilies": [
+          {
+            "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "name": "SCOTTIE",
+            "isPermitted": true
+          },
+          {
+            "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "name": "IGNACIO",
+            "isPermitted": true
+          },
+          {
+            "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "name": "Christie",
+            "isPermitted": true
+          },
+          {
+            "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+            "name": "Enhanced Services",
+            "isPermitted": true
+          },
+          {
+            "id": "vTerrance",
+            "name": "vTerrance",
+            "isPermitted": true
+          },
+          {
+            "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+            "name": "vSCP",
+            "isPermitted": true
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": true
+          },
+          {
+            "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+            "name": "BVOIP",
+            "isPermitted": true
+          },
+          {
+            "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+            "name": "LINDSEY",
+            "isPermitted": true
+          },
+          {
+            "id": "LRSI-OSPF",
+            "name": "LRSI-OSPF",
+            "isPermitted": true
+          },
+          {
+            "id": "vRosemarie",
+            "name": "HNGATEWAY",
+            "isPermitted": true
+          },
+          {
+            "id": "vHNPaas",
+            "name": "WILKINS",
+            "isPermitted": true
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "TYLER SILVIA",
+            "isPermitted": true
+          },
+          {
+            "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+            "name": "VROUTER",
+            "isPermitted": true
+          },
+          {
+            "id": "Cisneros",
+            "name": "vMuriel",
+            "isPermitted": true
+          },
+          {
+            "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+            "name": "CARA Griffin",
+            "isPermitted": true
+          },
+          {
+            "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          },
+          {
+            "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+            "name": "Transport",
+            "isPermitted": true
+          },
+          {
+            "id": "vSalvatore",
+            "name": "vSalvatore",
+            "isPermitted": true
+          },
+          {
+            "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+            "name": "Josefina",
+            "isPermitted": true
+          },
+          {
+            "id": "vHubbard",
+            "name": "vHubbard",
+            "isPermitted": true
+          },
+          {
+            "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          }
+        ],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [
+            {
+              "id": "0",
+              "name": "vRichardson",
+              "isPermitted": false
+            },
+            {
+              "id": "1",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "2",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "3",
+              "name": "vJamie",
+              "isPermitted": false
+            },
+            {
+              "id": "4",
+              "name": "vVoiceMail",
+              "isPermitted": false
+            },
+            {
+              "id": "5",
+              "name": "Kennedy",
+              "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": "LINDSEY",
+              "isPermitted": false
+            },
+            {
+              "id": "17",
+              "name": "JOHANNA_SANTOS",
+              "isPermitted": false
+            },
+            {
+              "id": "18",
+              "name": "vCarroll",
+              "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": "WayneHolland"
+            },
+            {
+              "id": "Melissa",
+              "name": "Melissa"
+            }
+          ],
+          "projectList": [
+            {
+              "id": "WATKINS",
+              "name": "WATKINS"
+            },
+            {
+              "id": "x1",
+              "name": "x1"
+            },
+            {
+              "id": "yyy1",
+              "name": "yyy1"
+            }
+          ],
+          "lineOfBusinessList": [
+            {
+              "id": "ONAP",
+              "name": "ONAP"
+            },
+            {
+              "id": "zzz1",
+              "name": "zzz1"
+            }
+          ],
+          "platformList": [
+            {
+              "id": "platform",
+              "name": "platform"
+            },
+            {
+              "id": "xxx1",
+              "name": "xxx1"
+            }
+          ]
+        },
+        "type": "[LCP_REGIONS_AND_TENANTS] Update"
+      }
+    }
+  }
+
+  function getReduxWithVFModuleMissingData() {
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "availability_zone_0": {
+                    "type": "string",
+                    "description": "The Availability Zone to launch the instance.",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "mtpocfo-kvm-az01"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "2017488_adiodvpe0_bandwidth_units"
+                  },
+                  "bandwidth": {
+                    "displayName": "bandwidth",
+                    "command": "get_input",
+                    "inputName": "2017488_adiodvpe0_bandwidth"
+                  },
+                  "AIC_CLLI": {
+                    "displayName": "AIC_CLLI",
+                    "command": "get_input",
+                    "inputName": "2017488_adiodvpe0_AIC_CLLI"
+                  },
+                  "availability_zone_0": {
+                    "displayName": "availability_zone_0",
+                    "command": "get_input",
+                    "inputName": "2017488_adiodvpe0_availability_zone_0"
+                  },
+                  "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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "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.0.0.10",
+                  "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": 2,
+                      "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": {}
+          },
+          "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": "Emanuel",
+              "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "false",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": {}
+          }
+        },
+        "serviceInstance": {
+          "f4d84bb4-a416-4b4e-997e-0059973630b9": {
+            "vnfs": {
+              "2017-488_ADIOD-vPE 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0jkyqv": {
+                      "isMissingData": true,
+                      "sdncPreReload": null,
+                      "modelInfo": {
+                        "modelType": "VFmodule",
+                        "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                        "modelVersionId": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+                        "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                        "modelVersion": "6",
+                        "modelCustomizationId": "5c5f91f9-5e31-4120-b892-5536587ec258",
+                        "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"
+                      },
+                      "instanceParams": [
+                        {}
+                      ],
+                      "trackById": "n2ydptuy9lj"
+                    }
+                  }
+                },
+                "isMissingData": false,
+                "originalName": "2017-488_ADIOD-vPE 0",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": null,
+                "tenantId": null,
+                "lineOfBusiness": null,
+                "platformName": null,
+                "modelInfo": {
+                  "modelType": "VF",
+                  "modelInvariantId": "5be7e99e-8eb2-4d97-be63-8081ff3cd10e",
+                  "modelVersionId": "f4d84bb4-a416-4b4e-997e-0059973630b9",
+                  "modelName": "2017-488_ADIOD-vPE",
+                  "modelVersion": "9.0",
+                  "modelCustomizationName": "2017-488_ADIOD-vPE 0"
+                },
+                "trackById": "iapflwk8bip"
+              }
+            },
+            "instanceParams": [
+              {
+                "2017488_adiodvpe0_ASN": "AV_vPE"
+              }
+            ],
+            "validationCounter": 1,
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "aicZoneId": "JAG1",
+            "projectName": "x1",
+            "owningEntityId": "aaa1",
+            "rollbackOnFailure": "true",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "598e3f9e-3244-4d8f-a8e0-0e5d7a29eda9",
+              "modelVersionId": "f4d84bb4-a416-4b4e-997e-0059973630b9",
+              "modelName": "ADIOD vMX vPE_BV Service 488",
+              "modelVersion": "1.0"
+            },
+            "existingVNFCounterMap": {
+              "41516cc6-5098-4b40-a619-f8d5f55fc4d8": 1
+            },
+            "existingNetworksCounterMap": {},
+            "tenantName": "USP-SIP-IC-24335-T-01",
+            "aicZoneName": "YUDFJULP-JAG1"
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [
+            {
+              "id": "JANET25",
+              "name": "JANET25",
+              "isPermitted": true
+            },
+            {
+              "id": "hvf6",
+              "name": "hvf6",
+              "isPermitted": true
+            }
+          ],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [
+              {
+                "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                "name": "USP-SIP-IC-24335-T-01",
+                "isPermitted": true
+              }
+            ],
+            "hvf6": [
+              {
+                "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "name": "AIN Web Tool-15-D-testalexandria",
+                "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-hvf6-09",
+                "isPermitted": true
+              },
+              {
+                "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                "name": "DN5242-Nov16-T3",
+                "isPermitted": true
+              }
+            ]
+          }
+        },
+        "subscribers": [
+          {
+            "id": "CAR_2020_ER",
+            "name": "CAR_2020_ER",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-2",
+            "name": "DALE BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-1",
+            "name": "LLOYD BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example",
+            "name": "JimmyExampleCust-20161102",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example2",
+            "name": "JimmyExampleCust-20161103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-102",
+            "name": "ERICA5779-TestSub-PWT-102",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-101",
+            "name": "ERICA5779-TestSub-PWT-101",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-4",
+            "name": "ERICA5779-Subscriber-5",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-103",
+            "name": "ERICA5779-TestSub-PWT-103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-2",
+            "name": "ERICA5779-Subscriber-2",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": true
+          },
+          {
+            "id": "ERICA5779-Subscriber-3",
+            "name": "ERICA5779-Subscriber-3",
+            "isPermitted": false
+          },
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          }
+        ],
+        "productFamilies": [
+          {
+            "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "name": "SCOTTIE",
+            "isPermitted": true
+          },
+          {
+            "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "name": "IGNACIO",
+            "isPermitted": true
+          },
+          {
+            "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "name": "Christie",
+            "isPermitted": true
+          },
+          {
+            "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+            "name": "Enhanced Services",
+            "isPermitted": true
+          },
+          {
+            "id": "vTerrance",
+            "name": "vTerrance",
+            "isPermitted": true
+          },
+          {
+            "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+            "name": "vSCP",
+            "isPermitted": true
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": true
+          },
+          {
+            "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+            "name": "BVOIP",
+            "isPermitted": true
+          },
+          {
+            "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+            "name": "LINDSEY",
+            "isPermitted": true
+          },
+          {
+            "id": "LRSI-OSPF",
+            "name": "LRSI-OSPF",
+            "isPermitted": true
+          },
+          {
+            "id": "vRosemarie",
+            "name": "HNGATEWAY",
+            "isPermitted": true
+          },
+          {
+            "id": "vHNPaas",
+            "name": "WILKINS",
+            "isPermitted": true
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "TYLER SILVIA",
+            "isPermitted": true
+          },
+          {
+            "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+            "name": "VROUTER",
+            "isPermitted": true
+          },
+          {
+            "id": "Cisneros",
+            "name": "vMuriel",
+            "isPermitted": true
+          },
+          {
+            "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+            "name": "CARA Griffin",
+            "isPermitted": true
+          },
+          {
+            "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          },
+          {
+            "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+            "name": "Transport",
+            "isPermitted": true
+          },
+          {
+            "id": "vSalvatore",
+            "name": "vSalvatore",
+            "isPermitted": true
+          },
+          {
+            "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+            "name": "Josefina",
+            "isPermitted": true
+          },
+          {
+            "id": "vHubbard",
+            "name": "vHubbard",
+            "isPermitted": true
+          },
+          {
+            "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          }
+        ],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [
+            {
+              "id": "0",
+              "name": "vRichardson",
+              "isPermitted": false
+            },
+            {
+              "id": "1",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "2",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "3",
+              "name": "vJamie",
+              "isPermitted": false
+            },
+            {
+              "id": "4",
+              "name": "vVoiceMail",
+              "isPermitted": false
+            },
+            {
+              "id": "5",
+              "name": "Kennedy",
+              "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": "LINDSEY",
+              "isPermitted": false
+            },
+            {
+              "id": "17",
+              "name": "JOHANNA_SANTOS",
+              "isPermitted": false
+            },
+            {
+              "id": "18",
+              "name": "vCarroll",
+              "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": "WayneHolland"
+            },
+            {
+              "id": "Melissa",
+              "name": "Melissa"
+            }
+          ],
+          "projectList": [
+            {
+              "id": "WATKINS",
+              "name": "WATKINS"
+            },
+            {
+              "id": "x1",
+              "name": "x1"
+            },
+            {
+              "id": "yyy1",
+              "name": "yyy1"
+            }
+          ],
+          "lineOfBusinessList": [
+            {
+              "id": "ONAP",
+              "name": "ONAP"
+            },
+            {
+              "id": "zzz1",
+              "name": "zzz1"
+            }
+          ],
+          "platformList": [
+            {
+              "id": "platform",
+              "name": "platform"
+            },
+            {
+              "id": "xxx1",
+              "name": "xxx1"
+            }
+          ]
+        },
+        "type": "[LCP_REGIONS_AND_TENANTS] Update"
+      }
+    }
+  }
+
+  function getReduxWith2Networks() {
+    return {
+      "global": {
+        "name": null,
+        "type": "UPDATE_DRAWING_BOARD_STATUS",
+        "flags": {
+          "CREATE_INSTANCE_TEST": false,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_DEFAULT_VNF": true,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
+          "FLAG_A_LA_CARTE_AUDIT_INFO": true,
+          "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": true,
+          "FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS": true,
+          "FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE": false,
+          "FLAG_1902_NEW_VIEW_EDIT": false,
+          "FLAG_1810_IDENTIFY_SERVICE_FOR_NEW_UI": false,
+          "FLAG_1902_VNF_GROUPING": false,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_ASYNC_ALACARTE_VFMODULE": true,
+          "FLAG_ASYNC_ALACARTE_VNF": true,
+          "FLAG_SHIFT_VFMODULE_PARAMS_TO_VNF": true,
+          "FLAG_1810_AAI_LOCAL_CACHE": true,
+          "FLAG_EXP_USE_DEFAULT_HOST_NAME_VERIFIER": false,
+          "FLAG_EXP_ANY_ALACARTE_NEW_INSTANTIATION_UI": false,
+          "FLAG_SUPPLEMENTARY_FILE": true,
+          "FLAG_5G_IN_NEW_INSTANTIATION_UI": true,
+          "FLAG_RESTRICTED_SELECT": false,
+          "FLAG_1810_CR_LET_SELECTING_COLLECTOR_TYPE_UNCONDITIONALLY": true
+        },
+        "drawingBoardStatus": "CREATE"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "2ab1da67-39cc-425f-ba52-59a64d0ea04a": {
+            "service": {
+              "uuid": "2ab1da67-39cc-425f-ba52-59a64d0ea04a",
+              "invariantUuid": "712b3447-f096-42f6-ae4c-4bdc8988feb6",
+              "name": "sgi_direct_net NC SRIOV network",
+              "version": "1.0",
+              "toscaModelURL": null,
+              "category": "Network Service",
+              "serviceType": "INFRASTRUCTURE",
+              "serviceRole": "PROVIDER-NETWORK",
+              "description": "SRIOV network model for NC 1.0, VLAN ID 103",
+              "serviceEcompNaming": "false",
+              "instantiationType": "A-La-Carte",
+              "inputs": {},
+              "vidNotions": {
+                "instantiationUI": "networkWithPropertyNetworkTechnologyEqualsStandardSriovOrOvs",
+                "modelCategory": "5G Provider Network",
+                "viewEditUI": "legacy"
+              }
+            },
+            "vnfs": {},
+            "networks": {
+              "SR-IOV Provider 2-1": {
+                "uuid": "01f4c475-3f89-4f00-a2f4-39a873dba0ae",
+                "invariantUuid": "ffb9e45c-e674-4289-aad3-00040ad746e4",
+                "description": "NETWORK_CLOUD_PROVIDER_NETWORK",
+                "name": "NETWORK_CLOUD_PROVIDER_NETWORK",
+                "version": "1.0",
+                "customizationUuid": "42551d11-b8d1-460d-8795-3e1363ad7736",
+                "inputs": {},
+                "commands": {},
+                "properties": {
+                  "network_role": "sgi_direct_net_1",
+                  "network_assignments": "{is_external_network=false, is_shared_network=true, is_trunked=false, ipv4_subnet_default_assignment={dhcp_enabled=false, ip_version=4, min_subnets_count=1, use_ipv4=true}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={dhcp_enabled=false, use_ipv6=true, ip_version=6, min_subnets_count=1}, related_networks=[{related_network_role=sgi_direct_net_1_tenant}]}",
+                  "exVL_naming": "{ecomp_generated_naming=false}",
+                  "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+                  "network_scope": "GLOBAL",
+                  "ecomp_generated_naming": "false",
+                  "network_type": "SR-IOV-PROVIDER2-1",
+                  "provider_network": "{physical_network_name=sriovnet1, is_provider_network=true}",
+                  "network_technology": "STANDARD-SR-IOV",
+                  "network_homing": "{ecomp_selected_instance_node_target=false}"
+                },
+                "type": "VL",
+                "modelCustomizationName": "SR-IOV Provider 2-1"
+              },
+              "SR-IOV Provider 2-2": {
+                "uuid": "01f4c475-3f89-4f00-a2f4-39a873dba0ae",
+                "invariantUuid": "ffb9e45c-e674-4289-aad3-00040ad746e4",
+                "description": "NETWORK_CLOUD_PROVIDER_NETWORK",
+                "name": "NETWORK_CLOUD_PROVIDER_NETWORK",
+                "version": "1.0",
+                "customizationUuid": "14d2dc2b-4e85-4ef5-b4da-fe996e2a5d33",
+                "inputs": {},
+                "commands": {},
+                "properties": {
+                  "network_role": "sgi_direct_net_2",
+                  "network_assignments": "{is_external_network=false, is_shared_network=true, is_trunked=false, ipv4_subnet_default_assignment={dhcp_enabled=false, ip_version=4, min_subnets_count=1, use_ipv4=true}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={dhcp_enabled=false, use_ipv6=true, ip_version=6, min_subnets_count=1}, related_networks=[{related_network_role=sgi_direct_net_2_tenant}]}",
+                  "exVL_naming": "{ecomp_generated_naming=false}",
+                  "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+                  "network_scope": "GLOBAL",
+                  "ecomp_generated_naming": "false",
+                  "network_type": "SR-IOV-PROVIDER2-2",
+                  "provider_network": "{physical_network_name=sriovnet2, is_provider_network=true}",
+                  "network_technology": "STANDARD-SR-IOV",
+                  "network_homing": "{ecomp_selected_instance_node_target=false}"
+                },
+                "type": "VL",
+                "modelCustomizationName": "SR-IOV Provider 2-2"
+              }
+            },
+            "collectionResource": {},
+            "configurations": {},
+            "fabricConfigurations": {},
+            "serviceProxies": {},
+            "vfModules": {},
+            "volumeGroups": {},
+            "pnfs": {},
+            "vnfGroups": {}
+          }
+        },
+        "serviceInstance": {
+          "2ab1da67-39cc-425f-ba52-59a64d0ea04a": {
+            "action": "Create",
+            "isDirty": false,
+            "vnfs": {},
+            "instanceParams": [
+              {}
+            ],
+            "validationCounter": 0,
+            "existingNames": {
+              "myname": ""
+            },
+            "existingVNFCounterMap": {},
+            "existingVnfGroupCounterMap": {},
+            "existingNetworksCounterMap": {
+              "01f4c475-3f89-4f00-a2f4-39a873dba0ae": 1
+            },
+            "optionalGroupMembersMap": {},
+            "networks": {
+              "SR-IOV Provider 2-2": {
+                "action": "Create",
+                "inMaint": false,
+                "rollbackOnFailure": "true",
+                "originalName": "SR-IOV Provider 2-2",
+                "isMissingData": false,
+                "trackById": "83ad9rv48px",
+                "networkStoreKey": "SR-IOV Provider 2-2",
+                "instanceName": "NETWORK_CLOUD_PROVIDER_NETWORK",
+                "productFamilyId": null,
+                "lcpCloudRegionId": "olson5b",
+                "tenantId": "db1818f7f2e34862b378bfb2cc520f91",
+                "platformName": "APPLICATIONS-SERVICES",
+                "lineOfBusiness": null,
+                "instanceParams": [
+                  {}
+                ],
+                "modelInfo": {
+                  "modelInvariantId": "ffb9e45c-e674-4289-aad3-00040ad746e4",
+                  "modelVersionId": "01f4c475-3f89-4f00-a2f4-39a873dba0ae",
+                  "modelName": "NETWORK_CLOUD_PROVIDER_NETWORK",
+                  "modelVersion": "1.0",
+                  "modelCustomizationId": "14d2dc2b-4e85-4ef5-b4da-fe996e2a5d33",
+                  "modelCustomizationName": "SR-IOV Provider 2-2",
+                  "uuid": "01f4c475-3f89-4f00-a2f4-39a873dba0ae"
+                },
+                "uuid": "01f4c475-3f89-4f00-a2f4-39a873dba0ae"
+              }
+            },
+            "vnfGroups": {},
+            "bulkSize": 1,
+            "instanceName": "myname",
+            "globalSubscriberId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "subscriptionServiceType": "LINDSEY",
+            "owningEntityId": "2d097967-10d4-4c7f-b23c-89978249ae17",
+            "projectName": null,
+            "rollbackOnFailure": "true",
+            "aicZoneName": null,
+            "owningEntityName": "FIREWALL-MISCELLANEOUS",
+            "testApi": "VNF_API",
+            "tenantName": null,
+            "modelInfo": {
+              "modelInvariantId": "712b3447-f096-42f6-ae4c-4bdc8988feb6",
+              "modelVersionId": "2ab1da67-39cc-425f-ba52-59a64d0ea04a",
+              "modelName": "sgi_direct_net NC SRIOV network",
+              "modelVersion": "1.0",
+              "uuid": "2ab1da67-39cc-425f-ba52-59a64d0ea04a"
+            },
+            "isALaCarte": true,
+            "name": "sgi_direct_net NC SRIOV network",
+            "version": "1.0",
+            "description": "SRIOV network model for NC 1.0, VLAN ID 103",
+            "category": "Network Service",
+            "uuid": "2ab1da67-39cc-425f-ba52-59a64d0ea04a",
+            "invariantUuid": "712b3447-f096-42f6-ae4c-4bdc8988feb6",
+            "serviceType": "INFRASTRUCTURE",
+            "serviceRole": "PROVIDER-NETWORK",
+            "vidNotions": {
+              "instantiationUI": "networkWithPropertyNetworkTechnologyEqualsStandardSriovOrOvs",
+              "modelCategory": "5G Provider Network",
+              "viewEditUI": "legacy"
+            },
+            "isEcompGeneratedNaming": false,
+            "isMultiStepDesign": false
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [
+            {
+              "id": "olson5a",
+              "name": "olson5a (AIC)",
+              "isPermitted": true,
+              "cloudOwner": "irma-aic"
+            },
+            {
+              "id": "olson5b",
+              "name": "olson5b (AIC)",
+              "isPermitted": true,
+              "cloudOwner": "irma-aic"
+            },
+            {
+              "id": "olson6a",
+              "name": "olson6a (AIC)",
+              "isPermitted": true,
+              "cloudOwner": "irma-aic"
+            }
+          ],
+          "lcpRegionsTenantsMap": {
+            "olson5a": [
+              {
+                "id": "51e7dc5db9bb4c7b94766aacb8a3e72f",
+                "name": "Mobitools-FN-27099-T-01",
+                "isPermitted": true,
+                "cloudOwner": "irma-aic"
+              },
+              {
+                "id": "d5b3c05cffa645dd9951bf2dd9ef5416",
+                "name": "Mobisupport-FN-27099-T-01",
+                "isPermitted": true,
+                "cloudOwner": "irma-aic"
+              }
+            ],
+            "olson5b": [
+              {
+                "id": "db1818f7f2e34862b378bfb2cc520f91",
+                "name": "Mobisupport-FN-27099-T-02",
+                "isPermitted": true,
+                "cloudOwner": "irma-aic"
+              }
+            ],
+            "olson6a": [
+              {
+                "id": "1dcd712850414fbd91f8a9fc9cca7fd4",
+                "name": "FNvEPC-27099-T-MS-RDM6A",
+                "isPermitted": true,
+                "cloudOwner": "irma-aic"
+              },
+              {
+                "id": "26af9ed85a004932822a607d5e9973d5",
+                "name": "ssf-28239-T-RDM6A",
+                "isPermitted": true,
+                "cloudOwner": "irma-aic"
+              }
+            ]
+          }
+        },
+        "subscribers": [
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": false
+          },
+          {
+            "id": "VidE2ETest",
+            "name": "VidTest20161020",
+            "isPermitted": false
+          }
+        ],
+        "productFamilies": null,
+        "serviceTypes": {
+          "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb": [
+            {
+              "id": "22",
+              "name": "JOHANNA_SANTOS",
+              "isPermitted": true
+            },
+            {
+              "id": "11",
+              "name": "RAMSEY",
+              "isPermitted": false
+            },
+            {
+              "id": "3",
+              "name": "LINDSEY",
+              "isPermitted": true
+            },
+            {
+              "id": "6",
+              "name": "INFRASTRUCTURE",
+              "isPermitted": false
+            },
+            {
+              "id": "4",
+              "name": "BROOKE-RODRIQUEZ",
+              "isPermitted": false
+            },
+            {
+              "id": "0",
+              "name": "Emanuel",
+              "isPermitted": true
+            },
+            {
+              "id": "15",
+              "name": "Kennedy",
+              "isPermitted": true
+            },
+            {
+              "id": "21",
+              "name": "SSD",
+              "isPermitted": true
+            },
+            {
+              "id": "18",
+              "name": "VPMS",
+              "isPermitted": true
+            },
+            {
+              "id": "1",
+              "name": "vJamie",
+              "isPermitted": true
+            },
+            {
+              "id": "27",
+              "name": "vEPDG",
+              "isPermitted": false
+            },
+            {
+              "id": "23",
+              "name": "vRichardson",
+              "isPermitted": true
+            },
+            {
+              "id": "7",
+              "name": "vGDF",
+              "isPermitted": false
+            },
+            {
+              "id": "2",
+              "name": "vCarroll",
+              "isPermitted": true
+            },
+            {
+              "id": "17",
+              "name": "vMGCF",
+              "isPermitted": false
+            },
+            {
+              "id": "9",
+              "name": "vMME",
+              "isPermitted": true
+            },
+            {
+              "id": "25",
+              "name": "vMMSC",
+              "isPermitted": true
+            },
+            {
+              "id": "8",
+              "name": "vMNS",
+              "isPermitted": true
+            },
+            {
+              "id": "14",
+              "name": "vMOG",
+              "isPermitted": true
+            },
+            {
+              "id": "10",
+              "name": "vOTA",
+              "isPermitted": true
+            },
+            {
+              "id": "16",
+              "name": "vSCP",
+              "isPermitted": true
+            },
+            {
+              "id": "24",
+              "name": "vSEGW",
+              "isPermitted": true
+            },
+            {
+              "id": "12",
+              "name": "vSILB",
+              "isPermitted": false
+            },
+            {
+              "id": "19",
+              "name": "vSON",
+              "isPermitted": false
+            },
+            {
+              "id": "13",
+              "name": "vSSF",
+              "isPermitted": false
+            },
+            {
+              "id": "26",
+              "name": "vUDR",
+              "isPermitted": false
+            },
+            {
+              "id": "20",
+              "name": "vVM",
+              "isPermitted": true
+            },
+            {
+              "id": "5",
+              "name": "vVoiceMail",
+              "isPermitted": true
+            }
+          ]
+        },
+        "aicZones": null,
+        "categoryParameters": {
+          "owningEntityList": [
+            {
+              "id": "1ae27f5e-c0b3-4daf-8561-b25fc1c716e4",
+              "name": "AIC-ECOMP"
+            },
+            {
+              "id": "2e51ed6c-1fac-43d4-8f84-9ec405eb7f35",
+              "name": "ENTERTAINMENT-VIDEO"
+            },
+            {
+              "id": "2d097967-10d4-4c7f-b23c-89978249ae17",
+              "name": "FIREWALL-MISCELLANEOUS"
+            },
+            {
+              "id": "aedf37e2-acda-4976-b89b-fd6d4ddffbc6",
+              "name": "IP-COMMUNICATIONS"
+            },
+            {
+              "id": "9463675f-6a75-4cc8-8054-c6cb2e67ad51",
+              "name": "METRO-PACKET-CORE"
+            },
+            {
+              "id": "92ddf9af-acae-484c-a786-ad7e9c0da26f",
+              "name": "MOBILITY-ACCESS"
+            },
+            {
+              "id": "10c645f5-9924-4b89-bec0-b17cf49d3cad",
+              "name": "MOBILITY-CORE"
+            },
+            {
+              "id": "048eb6e7-fa94-4f3b-ae03-3175a750dc57",
+              "name": "OPTICAL-TRANSPORT"
+            },
+            {
+              "id": "0efc70be-d674-4777-a0fa-329eae187ca0",
+              "name": "PACKET-CORE"
+            },
+            {
+              "id": "0463287b-b133-46ef-a0f5-9ce62be3a053",
+              "name": "PREMISES"
+            },
+            {
+              "id": "ae4505ad-2961-4395-8659-df2253af4fa8",
+              "name": "WIRELINE-ACCESS"
+            }
+          ],
+          "projectList": [
+            {
+              "id": "G.FAST",
+              "name": "G.FAST"
+            },
+            {
+              "id": "GigaPower",
+              "name": "GigaPower"
+            },
+            {
+              "id": "Kennedy",
+              "name": "Kennedy"
+            },
+            {
+              "id": "Trinity",
+              "name": "Trinity"
+            },
+            {
+              "id": "USP",
+              "name": "USP"
+            }
+          ],
+          "lineOfBusinessList": [
+            {
+              "id": "",
+              "name": ""
+            },
+            {
+              "id": "ADI",
+              "name": "ADI"
+            },
+            {
+              "id": "ADIG",
+              "name": "ADIG"
+            },
+            {
+              "id": "ADIOD",
+              "name": "ADIOD"
+            },
+            {
+              "id": "AT&TLEGACYDATASERVICES",
+              "name": "AT&TLEGACYDATASERVICES"
+            },
+            {
+              "id": "AT&TSWITCHEDETHERNET",
+              "name": "AT&TSWITCHEDETHERNET"
+            },
+            {
+              "id": "AVPN",
+              "name": "AVPN"
+            },
+            {
+              "id": "AVPN-MOW",
+              "name": "AVPN-MOW"
+            },
+            {
+              "id": "CALEA",
+              "name": "CALEA"
+            },
+            {
+              "id": "COLLABORATE",
+              "name": "COLLABORATE"
+            },
+            {
+              "id": "DIRECT-TV",
+              "name": "DIRECT-TV"
+            },
+            {
+              "id": "LINDSEY",
+              "name": "LINDSEY"
+            },
+            {
+              "id": "FLEXWARE",
+              "name": "FLEXWARE"
+            },
+            {
+              "id": "INFRASTRUCTURE",
+              "name": "INFRASTRUCTURE"
+            },
+            {
+              "id": "IOT",
+              "name": "IOT"
+            },
+            {
+              "id": "IP-FLEXIBLE-REACH",
+              "name": "IP-FLEXIBLE-REACH"
+            },
+            {
+              "id": "IP-TOLL-FREE",
+              "name": "IP-TOLL-FREE"
+            },
+            {
+              "id": "MOBILITY-ABS",
+              "name": "MOBILITY-ABS"
+            },
+            {
+              "id": "MOBILITY-CONSUMER",
+              "name": "MOBILITY-CONSUMER"
+            },
+            {
+              "id": "MOBILITY-RESELLER",
+              "name": "MOBILITY-RESELLER"
+            },
+            {
+              "id": "NETBOND",
+              "name": "NETBOND"
+            },
+            {
+              "id": "SD-WAN",
+              "name": "SD-WAN"
+            },
+            {
+              "id": "UVERSE",
+              "name": "UVERSE"
+            },
+            {
+              "id": "UVERSE-VOICE",
+              "name": "UVERSE-VOICE"
+            },
+            {
+              "id": "VIRTUAL-EDGE",
+              "name": "VIRTUAL-EDGE"
+            },
+            {
+              "id": "VOLTE",
+              "name": "VOLTE"
+            }
+          ],
+          "platformList": [
+            {
+              "id": "3rdPartyCloud",
+              "name": "3rdPartyCloud"
+            },
+            {
+              "id": "ACCESS",
+              "name": "ACCESS"
+            },
+            {
+              "id": "AIC",
+              "name": "AIC"
+            },
+            {
+              "id": "APPLICATIONS-SERVICES",
+              "name": "APPLICATIONS-SERVICES"
+            },
+            {
+              "id": "BVOIP",
+              "name": "BVOIP"
+            },
+            {
+              "id": "CALEA-DEDICATED",
+              "name": "CALEA-DEDICATED"
+            },
+            {
+              "id": "CBB-MPLS-CORE",
+              "name": "CBB-MPLS-CORE"
+            },
+            {
+              "id": "D1",
+              "name": "D1"
+            },
+            {
+              "id": "D1.5",
+              "name": "D1.5"
+            },
+            {
+              "id": "EPC",
+              "name": "EPC"
+            },
+            {
+              "id": "FIRSTNET-DEDICATED",
+              "name": "FIRSTNET-DEDICATED"
+            },
+            {
+              "id": "IMS-USP",
+              "name": "IMS-USP"
+            },
+            {
+              "id": "IPAG",
+              "name": "IPAG"
+            },
+            {
+              "id": "MNS",
+              "name": "MNS"
+            },
+            {
+              "id": "NETWORK-CLOUD",
+              "name": "NETWORK-CLOUD"
+            },
+            {
+              "id": "RADIO-WIRELESSENGINEERING",
+              "name": "RADIO-WIRELESSENGINEERING"
+            },
+            {
+              "id": "RAN",
+              "name": "RAN"
+            },
+            {
+              "id": "UCPE",
+              "name": "UCPE"
+            },
+            {
+              "id": "VNI",
+              "name": "VNI"
+            }
+          ]
+        },
+        "type": "UPDATE_LCP_REGIONS_AND_TENANTS"
+      }
+    }
+  }
+
+  function getReduxWithVNFS(isEcompGeneratedNaming: boolean) {
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true,
+          "FLAG_SUPPLEMENTARY_FILE": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": "Emanuel",
+              "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": {
+                  "max_instances": 10,
+                  "min_instances": 1,
+                  "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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": isEcompGeneratedNaming.toString(),
+                  "sctp-a-IPv6_ethertype": "IPv6",
+                  "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "false",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": {
+                  "ecomp_generated_naming": "false",
+                  "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": {}
+          }
+        },
+        "serviceInstance": {
+          "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+            "vnfs": {
+              "VF_vMee 0": {
+                "originalName": "VF_vMee 0",
+                "rollbackOnFailure": "true",
+                "instanceName": "",
+                "vfModules": {
+                  "vf_vmee0..VfVmee..vmme_vlc..module-1": {
+                    "vf_vmee0..VfVmee..vmme_vlc..module-1dcudx": {
+                      "modelInfo": {
+                        "modelInvariantId": "98a7c88b-b577-476a-90e4-e25a5871e02b",
+                        "modelVersionId": "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+                        "modelName": "VfVmee..vmme_vlc..module-1",
+                        "modelVersion": "2",
+                        "modelCustomizationId": "55b1be94-671a-403e-a26c-667e9c47d091",
+                        "modelCustomizationName": "VfVmee..vmme_vlc..module-1"
+                      },
+                      "isMissingData": false,
+                      "supplementaryFile": "C:\\fakepath\\sample.json",
+                      "supplementaryFile_hidden": {},
+                      "supplementaryFile_hidden_content": "{\r\n  \"name\": \"a\",\r\n  \"value\": \"32\"\r\n}",
+                      "supplementaryFileContent": {
+                        "name": "a",
+                          "value": "32"
+                      },
+                      "supplementaryFileName": "sample.json",
+                      "instanceParams": [
+                        {}
+                      ]
+                    }
+                  }
+                },
+                "isMissingData": false,
+                "modelName": "VF_vMee 0",
+                "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "lineOfBusiness": "zzz1",
+                "platformName": "platform",
+                "modelInfo": {
+                  "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+                  "modelVersionId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+                  "modelName": "VF_vMee",
+                  "modelVersion": "2.0",
+                  "modelCustomizationId": "91415b44-753d-494c-926a-456a9172bbb9",
+                  "modelCustomizationName": "VF_vMee 0"
+                },
+                "legacyRegion": null
+              }
+            },
+            "networks": {},
+            "instanceParams": [
+              {}
+            ],
+            "validationCounter": 0,
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "lcpCloudRegionId": "hvf6",
+            "tenantId": "1178612d2b394be4834ad77f567c0af2",
+            "aicZoneId": "YYY1",
+            "projectName": "yyy1",
+            "owningEntityId": "aaa1",
+            "owningEntityName": "aaa1",
+            "rollbackOnFailure": "true",
+            "isALaCarte": false,
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "modelName": "ComplexService",
+              "modelVersion": "1.0"
+            },
+            "instanceName": "",
+            "existingNames": {
+              "serviceinstancename": "",
+              "vfvmee00001": ""
+            },
+            "existingVNFCounterMap": {
+              "91415b44-753d-494c-926a-456a9172bbb9": 1
+            },
+            "existingNetworksCounterMap": {},
+            "tenantName": "AIN Web Tool-15-D-SSPtestcustome",
+            "aicZoneName": "UUUAIAAI-YYY1"
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [
+            {
+              "id": "JANET25",
+              "name": "JANET25",
+              "isPermitted": true
+            },
+            {
+              "id": "hvf6",
+              "name": "hvf6",
+              "isPermitted": true
+            }
+          ],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [
+              {
+                "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                "name": "USP-SIP-IC-24335-T-01",
+                "isPermitted": true
+              }
+            ],
+            "hvf6": [
+              {
+                "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "name": "AIN Web Tool-15-D-testalexandria",
+                "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-hvf6-09",
+                "isPermitted": true
+              },
+              {
+                "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                "name": "DN5242-Nov16-T3",
+                "isPermitted": true
+              }
+            ]
+          }
+        },
+        "subscribers": [
+          {
+            "id": "CAR_2020_ER",
+            "name": "CAR_2020_ER",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-2",
+            "name": "DALE BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-1",
+            "name": "LLOYD BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example",
+            "name": "JimmyExampleCust-20161102",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example2",
+            "name": "JimmyExampleCust-20161103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-102",
+            "name": "ERICA5779-TestSub-PWT-102",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-101",
+            "name": "ERICA5779-TestSub-PWT-101",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-4",
+            "name": "ERICA5779-Subscriber-5",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-103",
+            "name": "ERICA5779-TestSub-PWT-103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-2",
+            "name": "ERICA5779-Subscriber-2",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": true
+          },
+          {
+            "id": "ERICA5779-Subscriber-3",
+            "name": "ERICA5779-Subscriber-3",
+            "isPermitted": false
+          },
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          }
+        ],
+        "productFamilies": [
+          {
+            "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "name": "SCOTTIE",
+            "isPermitted": true
+          },
+          {
+            "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "name": "IGNACIO",
+            "isPermitted": true
+          },
+          {
+            "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "name": "Christie",
+            "isPermitted": true
+          },
+          {
+            "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+            "name": "Enhanced Services",
+            "isPermitted": true
+          },
+          {
+            "id": "vTerrance",
+            "name": "vTerrance",
+            "isPermitted": true
+          },
+          {
+            "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+            "name": "vSCP",
+            "isPermitted": true
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": true
+          },
+          {
+            "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+            "name": "BVOIP",
+            "isPermitted": true
+          },
+          {
+            "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+            "name": "LINDSEY",
+            "isPermitted": true
+          },
+          {
+            "id": "LRSI-OSPF",
+            "name": "LRSI-OSPF",
+            "isPermitted": true
+          },
+          {
+            "id": "vRosemarie",
+            "name": "HNGATEWAY",
+            "isPermitted": true
+          },
+          {
+            "id": "vHNPaas",
+            "name": "WILKINS",
+            "isPermitted": true
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "TYLER SILVIA",
+            "isPermitted": true
+          },
+          {
+            "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+            "name": "VROUTER",
+            "isPermitted": true
+          },
+          {
+            "id": "Cisneros",
+            "name": "vMuriel",
+            "isPermitted": true
+          },
+          {
+            "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+            "name": "CARA Griffin",
+            "isPermitted": true
+          },
+          {
+            "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          },
+          {
+            "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+            "name": "Transport",
+            "isPermitted": true
+          },
+          {
+            "id": "vSalvatore",
+            "name": "vSalvatore",
+            "isPermitted": true
+          },
+          {
+            "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+            "name": "Josefina",
+            "isPermitted": true
+          },
+          {
+            "id": "vHubbard",
+            "name": "vHubbard",
+            "isPermitted": true
+          },
+          {
+            "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          }
+        ],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [
+            {
+              "id": "0",
+              "name": "vRichardson",
+              "isPermitted": false
+            },
+            {
+              "id": "1",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "2",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "3",
+              "name": "vJamie",
+              "isPermitted": false
+            },
+            {
+              "id": "4",
+              "name": "vVoiceMail",
+              "isPermitted": false
+            },
+            {
+              "id": "5",
+              "name": "Kennedy",
+              "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": "LINDSEY",
+              "isPermitted": false
+            },
+            {
+              "id": "17",
+              "name": "JOHANNA_SANTOS",
+              "isPermitted": false
+            },
+            {
+              "id": "18",
+              "name": "vCarroll",
+              "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": "WayneHolland"
+            },
+            {
+              "id": "Melissa",
+              "name": "Melissa"
+            }
+          ],
+          "projectList": [
+            {
+              "id": "WATKINS",
+              "name": "WATKINS"
+            },
+            {
+              "id": "x1",
+              "name": "x1"
+            },
+            {
+              "id": "yyy1",
+              "name": "yyy1"
+            }
+          ],
+          "lineOfBusinessList": [
+            {
+              "id": "ONAP",
+              "name": "ONAP"
+            },
+            {
+              "id": "zzz1",
+              "name": "zzz1"
+            }
+          ],
+          "platformList": [
+            {
+              "id": "platform",
+              "name": "platform"
+            },
+            {
+              "id": "xxx1",
+              "name": "xxx1"
+            }
+          ]
+        },
+        "type": "[PRODUCT_FAMILIES] Update"
+      }
+    }
+  }
+
+  function editSecondVnf(vnfNode: string) {
+    cy.drawingBoardTreeOpenContextMenuByElementDataTestId(vnfNode, 1)
+      .drawingBoardTreeClickOnContextMenuOptionByName('Edit');
+    cy.selectDropdownOptionByText('lineOfBusiness', 'ONAP');
+    cy.genericFormSubmitForm();
+  }
+
+  function checkDynamicInputs() {
+    cy.getReduxState().then((state) => {
+      let dynamicInputs = state.service.serviceHierarchy['f4d84bb4-a416-4b4e-997e-0059973630b9'].vnfs['2017-488_ADIOD-vPE 0'].inputs;
+
+      chai.expect(dynamicInputs.vnf_config_template_version.description).equal("VPE Software Version");
+      chai.expect(dynamicInputs.bandwidth_units.description).equal("Units of bandwidth");
+      chai.expect(dynamicInputs.bandwidth.description).equal("Requested VPE bandwidth");
+      chai.expect(dynamicInputs.AIC_CLLI.description).equal("AIC Site CLLI");
+      chai.expect(dynamicInputs.availability_zone_0.description).equal("The Availability Zone to launch the instance.")
+      chai.expect(dynamicInputs.ASN.description).equal("AV/PE");
+      chai.expect(dynamicInputs.vnf_instance_name.description).equal("The hostname assigned to the vpe.");
+
+    });
+  }
+
+  function assertEditvfModuleShowFile(vfModuleNode: string, content: string) {
+    cy.drawingBoardTreeOpenContextMenuByElementDataTestId(vfModuleNode)
+      .drawingBoardTreeClickOnContextMenuOptionByName('Edit');
+    cy.get(".file-name").contains(content);
+
+  }
 });
index be1b2ac..b358ad2 100644 (file)
@@ -1,11 +1,14 @@
 ///<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';
+import {JsonBuilder} from '../../support/jsonBuilders/jsonBuilder';
+import {AsyncInstantiationModel} from '../../support/jsonBuilders/models/asyncInstantiation.model';
+import {ServiceModel} from "../../support/jsonBuilders/models/service.model";
 
-describe('Instantiation status page', function () {
+describe('Instantiation status', function () {
   var jsonBuilderInstantiationBuilder : JsonBuilder<AsyncInstantiationModel> = new JsonBuilder<AsyncInstantiationModel>();
+  var asyncRes: Array<any>;
+
   beforeEach(() => {
     cy.window().then((win) => {
       win.sessionStorage.clear();
@@ -14,37 +17,78 @@ describe('Instantiation status page', function () {
       cy.initAAIMock();
       cy.initVidMock();
       jsonBuilderInstantiationBuilder.basicMock('/cypress/support/jsonBuilders/mocks/jsons/asyncInstantiation.json',
-        Cypress.config('baseUrl') + "/asyncInstantiation**");
+        Cypress.config('baseUrl') + "/asyncInstantiation**",
+        (res: any) => {
+            asyncRes = res;
+            return res;
+      });
       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);
-          }
+  afterEach(() => {
+    cy.screenshot();
+  });
+
+  it('should display the correct icons per status', function () {
+      const serviceAction:any = {INSTANTIATE : 'Instantiate', DELETE: 'Delete', UPDATE: 'Update'};
+      cy.openIframe('app/ui/#/instantiationStatus');
+      for(let i = 0 ; i < asyncRes.length; i++){
+        if(asyncRes[i].project){
+          cy.getTableRowByIndex('instantiation-status', i).get('td#project span').contains(asyncRes[i].project);
         }
-      });
+        if(asyncRes[i].userId){
+          cy.getTableRowByIndex('instantiation-status', i).get('td#userId span').contains(asyncRes[i].userId);
+        }
+        if(asyncRes[i].tenantName){
+          cy.getTableRowByIndex('instantiation-status', i).get('td#tenantName span').contains(asyncRes[i].tenantName);
+        }
+        if(asyncRes[i].serviceModelName){
+          cy.getTableRowByIndex('instantiation-status', i).get('td#serviceModelName span').contains(asyncRes[i].serviceModelName);
+        }
+        if(asyncRes[i].serviceInstanceName){
+          cy.getTableRowByIndex('instantiation-status', i).get('td#serviceInstanceName span').contains(asyncRes[i].serviceInstanceName);
+        }
+        if(asyncRes[i].serviceModelVersion){
+          cy.getTableRowByIndex('instantiation-status', i).get('td#serviceModelVersion span').contains(asyncRes[i].serviceModelVersion);
+        }
+        if(asyncRes[i].subscriberName){
+          cy.getTableRowByIndex('instantiation-status', i).get('td#subscriberName span').contains(asyncRes[i].subscriberName);
+        }
+        if(asyncRes[i].action) {
+          cy.getTableRowByIndex('instantiation-status', i).get('td#action span').contains(serviceAction[asyncRes[i].action]);
+        }
+    }
+  });
+
+  it('should enable correct menu items', function () {
+        cy.openIframe('app/ui/#/instantiationStatus');
+
+        // Instantiate action with Job status FAILED - isRetry = true
+        cy.get( '#5c2cd8e5-27d0-42e3-85a1-85db5eaba459').find('.menu-div').click();
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-retry']`).should('not.exist');
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-remove']`).should('exist');
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-open']`).should('exist');
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-hide']`).should('not.exist');
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-audit-info']`).should('not.exist');
+
+        // Instantiate action with Job status FAILED - isRetry = false
+        cy.get( '#e1db03c3-6274-4ff7-84cf-7bd3a3946de7').find('.menu-div').click();
+        cy.get('.dropdown-menu').find(`[data-tests-id='context-menu-retry']`).should('not.be.visible');
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-open']`).should('exist');
+
+        //Delete action with Job status IN_PROGRESS
+        cy.get( '#850dc7d2-5240-437f-9bcd-b1ed7dc339c2').find('.menu-div').click();
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-remove']`).should('exist');
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-open']`).should('exist');
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-hide']`).should('exist');
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-audit-info']`).should('not.exist');
+        //Update action with Job status COMPLETED
+        cy.get( '#850dc7d2-5240-437f-9bcd-b1ed7dc339c1').find('.menu-div').click();
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-remove']`).should('exist');
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-open']`).should('not.exist');
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-hide']`).should('not.exist');
+        cy.get('.dropdown-menu').find('.disabled').find(`[data-tests-id='context-menu-audit-info']`).should('not.exist');
   });
+  
 });
diff --git a/vid-webpack-master/cypress/integration/iFrames/network.popup.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/network.popup.e2e.ts
new file mode 100644 (file)
index 0000000..1ad7064
--- /dev/null
@@ -0,0 +1,3087 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+
+import {JsonBuilder} from "../../support/jsonBuilders/jsonBuilder";
+import {ServiceModel} from "../../support/jsonBuilders/models/service.model";
+
+describe('Network popup', function () {
+
+  var jsonBuilderAndMock: JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+
+  beforeEach(() => {
+    cy.window().then((win) => {
+      win.sessionStorage.clear();
+      cy.setReduxState();
+      cy.preventErrorsOnLoading();
+      cy.permissionVidMock();
+      cy.setTestApiParamToGR();
+      cy.initAAIMock();
+      cy.initVidMock();
+      cy.login();
+    })
+  });
+
+  afterEach(() => {
+    cy.screenshot();
+  });
+
+  describe('basic UI tests', () => {
+
+    it('Network(A-La-Carte) - create / edit / duplicate / delete', function () {
+      let redux = getReduxWithVNFSAndNetwork();
+      redux.service.serviceHierarchy['6b528779-44a3-4472-bdff-9cd15ec93450'].service.instantiationType = 'A-La-Carte';
+
+      cy.setReduxState(<any>redux);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=6b528779-44a3-4472-bdff-9cd15ec93450');
+      //create
+      cy.getElementByDataTestsId('node-ExtVL 0-add-btn').click({force: true}).then(() => {
+
+
+        verifyServiceModelNameInModelInfo();
+        cy.fillNetworkPopup();
+      });
+    });
+
+    it('Network (Macro) - create / edit / duplicate / delete', function () {
+
+      cy.setReduxState(<any>getReduxWithVNFSAndNetwork());
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=6b528779-44a3-4472-bdff-9cd15ec93450');
+      //create
+      cy.getElementByDataTestsId('node-ExtVL 0-add-btn').click({force: true}).then(() => {
+        verifyServiceModelNameInModelInfo();
+        cy.fillNetworkPopup().then(()=>{
+          cy.getElementByDataTestsId('node-ddc3f20c-08b5-40fd-af72-c6d14636b986-ExtVL 0').should('be.visible');
+          cy.getElementByDataTestsId('numberButton').contains('1');
+
+          //Edit
+          cy.getElementByDataTestsId('node-ddc3f20c-08b5-40fd-af72-c6d14636b986-ExtVL 0-menu-btn').click({force: true})
+            .getElementByDataTestsId('context-menu-edit').click({force: true}).then(() => {
+            cy.checkIsOptionSelected('productFamily', 'a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb');
+            cy.checkIsOptionSelected('lcpRegion', 'hvf6');
+            cy.checkIsOptionSelected('tenant', '229bcdc6eaeb4ca59d55221141d01f8e');
+            cy.checkIsOptionSelected('lineOfBusiness', 'zzz1');
+            cy.checkIsOptionSelected('platform', 'xxx1');
+            //change platform value
+            cy.selectDropdownOptionByText('platform', 'platform');
+            cy.getElementByDataTestsId('form-set').click({force: true}).then(() => {
+              cy.getElementByDataTestsId('numberButton').contains('1');
+              cy.getElementByDataTestsId('node-ddc3f20c-08b5-40fd-af72-c6d14636b986-ExtVL 0-menu-btn').click({force: true})
+                .getElementByDataTestsId('context-menu-edit').click({force: true}).then(() => {
+                cy.checkIsOptionSelected('platform', 'platform');
+                // cancel button should close the dialog
+                cy.getElementByDataTestsId('cancelButton').click({force: true}).then(() => {
+                  // duplicate network
+                  cy.getElementByDataTestsId('node-ddc3f20c-08b5-40fd-af72-c6d14636b986-ExtVL 0-menu-btn').click({force: true})
+                    .getElementByDataTestsId('context-menu-duplicate').click({force: true}).then(() => {
+                    cy.getTagElementContainsText('button', 'Duplicate').click({force: true});
+                    cy.getElementByDataTestsId('node-ddc3f20c-08b5-40fd-af72-c6d14636b986-ExtVL 0').should('have.length', 2);
+                    cy.getElementByDataTestsId('numberButton').contains('2');
+                    //delete
+                    cy.getElementByDataTestsId('node-ddc3f20c-08b5-40fd-af72-c6d14636b986-ExtVL 0-menu-btn').eq(1).click({force: true})
+                    cy.getElementByDataTestsId('context-menu-remove').click({force: true}).then(()=>{
+                      cy.getElementByDataTestsId('numberButton').contains('1');
+                      cy.getElementByDataTestsId('node-ddc3f20c-08b5-40fd-af72-c6d14636b986-ExtVL 0').should('have.length', 1);
+
+                    })
+
+                  });
+                });
+              })
+            })
+          });
+        });
+        });
+
+    });
+
+    it('Network dynamic inputs', function () {
+      let redux = getReduxWithVNFSAndNetwork();
+      redux.service.serviceHierarchy['6b528779-44a3-4472-bdff-9cd15ec93450'].networks['ExtVL 0'].inputs = <any>{
+        "vnf_config_template_version": {
+          "type": "string",
+          "description": "VPE Software Version",
+          'entry_schema': null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "17.2"
+        },
+        "bandwidth_units": {
+          "type": "string",
+          "description": "Units of bandwidth",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": false,
+          "default": "Gbps"
+        }
+      };
+      cy.setReduxState(<any>redux);
+      cy.openIframe('app/ui/#/servicePlanning?serviceModelId=6b528779-44a3-4472-bdff-9cd15ec93450');
+
+      cy.getElementByDataTestsId('node-ExtVL 0-add-btn').click({force: true}).then(() => {
+        //check if dynamic inputs exist
+        cy.getElementByDataTestsId('vnf_config_template_version');
+        cy.getElementByDataTestsId('bandwidth_units');
+
+        //check if required icon exists
+        cy.get('label').contains('VNF config template version:').should('have.class', 'required');
+        cy.get('label').contains('Bandwidth units:').should('not.have.class', 'required');
+
+        //set button should be disabled when some dynamic inputs not valid
+        cy.selectDropdownOptionByText('productFamily', 'Emanuel');
+        cy.selectDropdownOptionByText('lcpRegion', 'hvf6');
+        cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-STTest2');
+        cy.selectDropdownOptionByText('lineOfBusiness', 'zzz1');
+        cy.selectDropdownOptionByText('platform', 'xxx1');
+        cy.getElementByDataTestsId('form-set').should('not.have.attr', 'disabled');
+
+        // clear required dynamic input.
+        cy.getElementByDataTestsId('vnf_config_template_version').clear();
+        cy.getElementByDataTestsId('form-set').should('have.attr', 'disabled');
+
+      });
+    });
+
+    it('Edit service with network - delete 1 create 1', function () {
+      const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+      const SERVICE_TYPE: string = "TYLER SILVIA";
+      const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+      const SERVICE_MODEL_ID: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicNetworkModel.json').then((res) => {
+        jsonBuilderAndMock.basicJson(res,
+          Cypress.config('baseUrl') + '/rest/models/services/6b528779-44a3-4472-bdff-9cd15ec93450',
+          200,
+          0,
+          'initServiceModel');
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicNetworkInstance.json').then((res) => {
+        jsonBuilderAndMock.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_get_service_instance_topology/e433710f-9217-458d-a79d-1c7aff376d89/TYLER SILVIA/f8791436-8d55-4fde-b4d5-72dd2cf13cfb",
+          200, 0,
+          "initServiceInstanceTopology"
+        )
+      });
+
+      cy.server().route({
+        url: Cypress.config('baseUrl') + '/asyncInstantiation/bulk',
+        method: 'POST',
+        status: 200,
+        response: "[]",
+      }).as("expectedPostAsyncInstantiation");
+
+      cy.openIframe(`app/ui/#/servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}`);
+
+      //add one network
+      cy.getElementByDataTestsId('node-ExtVL 0-add-btn').click({force: true}).then(() => {
+        verifyServiceModelNameInModelInfo();
+        cy.fillNetworkPopup();
+      });
+
+      const networkNodeToDelete = "node-ddc3f20c-08b5-40fd-af72-c6d14636b986-ExtVL 0";
+      cy.getElementByDataTestsId(`${networkNodeToDelete}-menu-btn`).eq(0).click({force: true})
+        .getElementByDataTestsId('context-menu-delete').click();
+
+      //click update
+      cy.getElementByDataTestsId('deployBtn').should('have.text', 'UPDATE').click();
+
+      cy.getReduxState().then((state) => {
+        const network = state.service.serviceInstance[SERVICE_MODEL_ID].networks["ExtVL 0_1"];
+        cy.wait('@expectedPostAsyncInstantiation').then(xhr => {
+          cy.readFile('../vid-automation/src/test/resources/asyncInstantiation/vidRequestDelete1Create1Network.json').then((expectedResult) => {
+            expectedResult.networks["ExtVL 0_1"].trackById = network.trackById;
+            cy.deepCompare(xhr.request.body, expectedResult);
+          });
+        });
+      });
+
+    });
+
+    function verifyServiceModelNameInModelInfo() {
+      cy.getElementByDataTestsId('model-item-label-serviceModelName').contains('Service Name');
+      cy.getElementByDataTestsId('model-item-value-serviceModelName').contains('action-data');
+    }
+
+    function getReduxWithVNFSAndNetwork() {
+      return {
+        "global": {
+          "name": null,
+          "flags": {
+            "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+            "FLAG_SHOW_ASSIGNMENTS": true,
+            "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+            "FLAG_UNASSIGN_SERVICE": true,
+            "FLAG_SHOW_VERIFY_SERVICE": false,
+            "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+            "FLAG_DUPLICATE_VNF": true,
+            "FLAG_SERVICE_MODEL_CACHE": true,
+            "FLAG_ADVANCED_PORTS_FILTER": true,
+            "CREATE_INSTANCE_TEST": false,
+            "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+            "FLAG_REGION_ID_FROM_REMOTE": true,
+            "FLAG_ASYNC_INSTANTIATION": true,
+            "FLAG_ASYNC_JOBS": true,
+            "EMPTY_DRAWING_BOARD_TEST": false,
+            "FLAG_ADD_MSO_TESTAPI_FIELD": true
+          },
+          "type": "[FLAGS] Update"
+        },
+        "service": {
+          "serviceHierarchy": {
+            "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": "Emanuel",
+                "serviceType": "",
+                "serviceRole": "",
+                "description": "ComplexService",
+                "serviceEcompNaming": "false",
+                "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": {
+                    "max_instances": 10,
+                    "min_instances": 1,
+                    "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                    "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                    "Internal2_net_cidr": "10.0.0.10",
+                    "sctp-a-ingress-dst_start_port": "0.0",
+                    "sctp-a-egress-dst_start_port": "0.0",
+                    "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                    "sctp-b-ipv6-egress_ethertype": "IPv4",
+                    "Internal1_net_cidr": "10.0.0.10",
+                    "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": "false",
+                    "sctp-a-IPv6_ethertype": "IPv6",
+                    "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                    "Internal1_net_cidr_len": "17",
+                    "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "vlc_st_interface_type_oam": "management",
+                    "multi_stage_design": "true",
+                    "oam_sec_group_name": "oam-sec-group",
+                    "Internal2_net_gateway": "10.0.0.10",
+                    "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                    "sctp-b-ipv6-egress-dst_start_port": "0",
+                    "Internal1_net_gateway": "10.0.0.10",
+                    "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:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "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": true
+                    },
+                    "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": true
+                },
+                "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": {}
+            },
+            "6b528779-44a3-4472-bdff-9cd15ec93450": {
+              "service": {
+                "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+                "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+                "name": "action-data",
+                "version": "1.0",
+                "toscaModelURL": null,
+                "category": "",
+                "serviceType": "",
+                "serviceRole": "",
+                "description": "",
+                "serviceEcompNaming": "false",
+                "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": {
+                    "vnf_config_template_version": {
+                      "type": "string",
+                      "description": "VPE Software Version",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "17.2"
+                    },
+                    "bandwidth_units": {
+                      "type": "string",
+                      "description": "Units of bandwidth",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "Gbps"
+                    },
+                    "bandwidth": {
+                      "type": "string",
+                      "description": "Requested VPE bandwidth",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "10"
+                    },
+                    "AIC_CLLI": {
+                      "type": "string",
+                      "description": "AIC Site CLLI",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "ATLMY8GA"
+                    },
+                    "ASN": {
+                      "type": "string",
+                      "description": "AV/PE",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "AV_vPE"
+                    },
+                    "vnf_instance_name": {
+                      "type": "string",
+                      "description": "The hostname assigned to the vpe.",
+                      "entry_schema": null,
+                      "inputProperties": 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": "10.0.0.10",
+                    "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": "10.0.0.10",
+                    "is_AVPN_service": "false",
+                    "vmx_RSG_name": "vREXI-affinity",
+                    "vmx_int_ctl_forwarding": "l2",
+                    "vmxvre_oam_ip_0": "10.0.0.10",
+                    "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": "10.0.0.10",
+                    "ecomp_generated_naming": "false",
+                    "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.0.0.10",
+                    "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": {
+                    "vnf_config_template_version": {
+                      "type": "string",
+                      "description": "VPE Software Version",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "17.2"
+                    },
+                    "bandwidth_units": {
+                      "type": "string",
+                      "description": "Units of bandwidth",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "Gbps"
+                    },
+                    "bandwidth": {
+                      "type": "string",
+                      "description": "Requested VPE bandwidth",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "10"
+                    },
+                    "AIC_CLLI": {
+                      "type": "string",
+                      "description": "AIC Site CLLI",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "ATLMY8GA"
+                    },
+                    "ASN": {
+                      "type": "string",
+                      "description": "AV/PE",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "AV_vPE"
+                    },
+                    "vnf_instance_name": {
+                      "type": "string",
+                      "description": "The hostname assigned to the vpe.",
+                      "entry_schema": null,
+                      "inputProperties": 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": "10.0.0.10",
+                    "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": "10.0.0.10",
+                    "is_AVPN_service": "false",
+                    "vmx_RSG_name": "vREXI-affinity",
+                    "vmx_int_ctl_forwarding": "l2",
+                    "vmxvre_oam_ip_0": "10.0.0.10",
+                    "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",
+                    "min_instances": "1",
+                    "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                    "vf_module_id": "123",
+                    "nf_function": "JAI",
+                    "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                    "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                    "ecomp_generated_naming": "false",
+                    "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.0.0.10",
+                    "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": {
+                    "vnf_config_template_version": {
+                      "type": "string",
+                      "description": "VPE Software Version",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "17.2"
+                    },
+                    "bandwidth_units": {
+                      "type": "string",
+                      "description": "Units of bandwidth",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "Gbps"
+                    },
+                    "bandwidth": {
+                      "type": "string",
+                      "description": "Requested VPE bandwidth",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "10"
+                    },
+                    "AIC_CLLI": {
+                      "type": "string",
+                      "description": "AIC Site CLLI",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "ATLMY8GA"
+                    },
+                    "ASN": {
+                      "type": "string",
+                      "description": "AV/PE",
+                      "entry_schema": null,
+                      "inputProperties": null,
+                      "constraints": [],
+                      "required": true,
+                      "default": "AV_vPE"
+                    },
+                    "vnf_instance_name": {
+                      "type": "string",
+                      "description": "The hostname assigned to the vpe.",
+                      "entry_schema": null,
+                      "inputProperties": 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": "10.0.0.10",
+                    "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": "10.0.0.10",
+                    "is_AVPN_service": "false",
+                    "vmx_RSG_name": "vREXI-affinity",
+                    "vmx_int_ctl_forwarding": "l2",
+                    "vmxvre_oam_ip_0": "10.0.0.10",
+                    "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",
+                    "max_instances": "3",
+                    "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",
+                    "min_instances": "1",
+                    "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                    "vf_module_id": "123",
+                    "nf_function": "JAI",
+                    "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                    "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                    "ecomp_generated_naming": "false",
+                    "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.0.0.10",
+                    "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": {
+                "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": {
+                    "min_instances": 1,
+                    "max_instances": 10,
+                    "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": {},
+              "fabricConfigurations": {},
+              "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": {
+            "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+              "vnfs": {
+                "VF_vMee 0": {
+                  "rollbackOnFailure": "true",
+                  "vfModules": {
+                    "vf_vmee0..VfVmee..base_vmme..module-0": {
+                      "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+                        "isMissingData": false,
+                        "sdncPreReload": null,
+                        "modelInfo": {
+                          "modelType": "VFmodule",
+                          "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+                          "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+                          "modelName": "VfVmee..base_vmme..module-0",
+                          "modelVersion": "2",
+                          "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                          "modelCustomizationName": "VfVmee..base_vmme..module-0"
+                        },
+                        "instanceParams": [
+                          {}
+                        ],
+                        "trackById": "wmtm6sy2uj"
+                      }
+                    }
+                  },
+                  "isMissingData": true,
+                  "originalName": "VF_vMee 0",
+                  "vnfStoreKey": "VF_vMee 0",
+                  "trackById": "p3wk448m5do",
+                  "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+                  "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+                  "lcpCloudRegionId": null,
+                  "tenantId": null,
+                  "lineOfBusiness": null,
+                  "platformName": null,
+                  "modelInfo": {
+                    "modelType": "VF",
+                    "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+                    "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+                    "modelName": "VF_vMee",
+                    "modelVersion": "2.0",
+                    "modelCustomizationName": "VF_vMee 0"
+                  }
+                }
+              },
+              "networks": {},
+              "instanceParams": [
+                {}
+              ],
+              "validationCounter": 1,
+              "existingNames": {},
+              "existingVNFCounterMap": {
+                "d91415b44-753d-494c-926a-456a9172bbb9": 1
+              },
+              "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+              "subscriptionServiceType": "TYLER SILVIA",
+              "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+              "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+              "lcpCloudRegionId": "hvf6",
+              "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+              "aicZoneId": "JAG1",
+              "projectName": "x1",
+              "rollbackOnFailure": "true",
+              "bulkSize": 1,
+              "modelInfo": {
+                "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+                "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+                "modelName": "ComplexService",
+                "modelVersion": "1.0",
+                "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+              },
+              "isALaCarte": false,
+              "name": "ComplexService",
+              "version": "1.0",
+              "description": "ComplexService",
+              "category": "Emanuel",
+              "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "serviceType": "",
+              "serviceRole": "",
+              "isMultiStepDesign": false
+            },
+            "6b528779-44a3-4472-bdff-9cd15ec93450": {
+              "networks": {},
+              "vnfs": {},
+              "instanceParams": [
+                {
+                  "2017488_adiodvpe0_ASN": "AV_vPE"
+                }
+              ],
+              "validationCounter": 0,
+              "existingNames": {
+                "123": "",
+                "instancename": "",
+                "yoav": ""
+              },
+              "existingVNFCounterMap": {},
+              "existingNetworksCounterMap": {},
+              "instanceName": "InstanceName",
+              "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+              "subscriptionServiceType": "TYLER SILVIA",
+              "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+              "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+              "lcpCloudRegionId": "JANET25",
+              "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+              "aicZoneId": "JAG1",
+              "projectName": null,
+              "rollbackOnFailure": "true",
+              "aicZoneName": "YUDFJULP-JAG1",
+              "owningEntityName": "WayneHolland",
+              "testApi": "GR_API",
+              "tenantName": "USP-SIP-IC-24335-T-01",
+              "bulkSize": 1,
+              "modelInfo": {
+                "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+                "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+                "modelName": "action-data",
+                "modelVersion": "1.0",
+                "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+              },
+              "isALaCarte": false,
+              "name": "action-data",
+              "version": "1.0",
+              "description": "",
+              "category": "",
+              "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+              "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "serviceType": "",
+              "serviceRole": "",
+              "isMultiStepDesign": false
+            }
+          },
+          "lcpRegionsAndTenants": {
+            "lcpRegionList": [
+              {
+                "id": "JANET25",
+                "name": "JANET25",
+                "isPermitted": true
+              },
+              {
+                "id": "hvf6",
+                "name": "hvf6",
+                "isPermitted": true
+              }
+            ],
+            "lcpRegionsTenantsMap": {
+              "JANET25": [
+                {
+                  "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                  "name": "USP-SIP-IC-24335-T-01",
+                  "isPermitted": true
+                }
+              ],
+              "hvf6": [
+                {
+                  "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                  "name": "AIN Web Tool-15-D-testalexandria",
+                  "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-hvf6-09",
+                  "isPermitted": true
+                },
+                {
+                  "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                  "name": "DN5242-Nov16-T3",
+                  "isPermitted": true
+                }
+              ]
+            }
+          },
+          "productFamilies": [
+            {
+              "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+              "name": "SCOTTIE",
+              "isPermitted": true
+            },
+            {
+              "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+              "name": "IGNACIO",
+              "isPermitted": true
+            },
+            {
+              "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+              "name": "Christie",
+              "isPermitted": true
+            },
+            {
+              "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+              "name": "Enhanced Services",
+              "isPermitted": true
+            },
+            {
+              "id": "vTerrance",
+              "name": "vTerrance",
+              "isPermitted": true
+            },
+            {
+              "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+              "name": "vSCP",
+              "isPermitted": true
+            },
+            {
+              "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+              "name": "Emanuel",
+              "isPermitted": true
+            },
+            {
+              "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+              "name": "BVOIP",
+              "isPermitted": true
+            },
+            {
+              "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+              "name": "LINDSEY",
+              "isPermitted": true
+            },
+            {
+              "id": "LRSI-OSPF",
+              "name": "LRSI-OSPF",
+              "isPermitted": true
+            },
+            {
+              "id": "vRosemarie",
+              "name": "HNGATEWAY",
+              "isPermitted": true
+            },
+            {
+              "id": "vHNPaas",
+              "name": "WILKINS",
+              "isPermitted": true
+            },
+            {
+              "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+              "name": "VROUTER",
+              "isPermitted": true
+            },
+            {
+              "id": "Cisneros",
+              "name": "vMuriel",
+              "isPermitted": true
+            },
+            {
+              "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+              "name": "CARA Griffin",
+              "isPermitted": true
+            },
+            {
+              "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+              "name": "DARREN MCGEE",
+              "isPermitted": true
+            },
+            {
+              "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+              "name": "Transport",
+              "isPermitted": true
+            },
+            {
+              "id": "vSalvatore",
+              "name": "vSalvatore",
+              "isPermitted": true
+            },
+            {
+              "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+              "name": "Josefina",
+              "isPermitted": true
+            },
+            {
+              "id": "vHubbard",
+              "name": "vHubbard",
+              "isPermitted": true
+            },
+            {
+              "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+              "name": "DARREN MCGEE",
+              "isPermitted": true
+            }
+          ],
+          "serviceTypes": {
+            "e433710f-9217-458d-a79d-1c7aff376d89": [
+              {
+                "id": "0",
+                "name": "vRichardson",
+                "isPermitted": false
+              },
+              {
+                "id": "1",
+                "name": "TYLER SILVIA",
+                "isPermitted": true
+              },
+              {
+                "id": "2",
+                "name": "Emanuel",
+                "isPermitted": false
+              },
+              {
+                "id": "3",
+                "name": "vJamie",
+                "isPermitted": false
+              },
+              {
+                "id": "4",
+                "name": "vVoiceMail",
+                "isPermitted": false
+              },
+              {
+                "id": "5",
+                "name": "Kennedy",
+                "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": "LINDSEY",
+                "isPermitted": false
+              },
+              {
+                "id": "17",
+                "name": "JOHANNA_SANTOS",
+                "isPermitted": false
+              },
+              {
+                "id": "18",
+                "name": "vCarroll",
+                "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": "WayneHolland"
+              },
+              {
+                "id": "Melissa",
+                "name": "Melissa"
+              }
+            ],
+            "projectList": [
+              {
+                "id": "WATKINS",
+                "name": "WATKINS"
+              },
+              {
+                "id": "x1",
+                "name": "x1"
+              },
+              {
+                "id": "yyy1",
+                "name": "yyy1"
+              }
+            ],
+            "lineOfBusinessList": [
+              {
+                "id": "ONAP",
+                "name": "ONAP"
+              },
+              {
+                "id": "zzz1",
+                "name": "zzz1"
+              }
+            ],
+            "platformList": [
+              {
+                "id": "platform",
+                "name": "platform"
+              },
+              {
+                "id": "xxx1",
+                "name": "xxx1"
+              }
+            ]
+          },
+          "type": "[LCP_REGIONS_AND_TENANTS] Update",
+          "subscribers": [
+            {
+              "id": "CAR_2020_ER",
+              "name": "CAR_2020_ER",
+              "isPermitted": true
+            },
+            {
+              "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+              "name": "JULIO ERICKSON",
+              "isPermitted": false
+            },
+            {
+              "id": "DHV1707-TestSubscriber-2",
+              "name": "DALE BRIDGES",
+              "isPermitted": false
+            },
+            {
+              "id": "DHV1707-TestSubscriber-1",
+              "name": "LLOYD BRIDGES",
+              "isPermitted": false
+            },
+            {
+              "id": "jimmy-example",
+              "name": "JimmyExampleCust-20161102",
+              "isPermitted": false
+            },
+            {
+              "id": "jimmy-example2",
+              "name": "JimmyExampleCust-20161103",
+              "isPermitted": false
+            },
+            {
+              "id": "ERICA5779-TestSub-PWT-102",
+              "name": "ERICA5779-TestSub-PWT-102",
+              "isPermitted": false
+            },
+            {
+              "id": "ERICA5779-TestSub-PWT-101",
+              "name": "ERICA5779-TestSub-PWT-101",
+              "isPermitted": false
+            },
+            {
+              "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "ERICA5779-Subscriber-4",
+              "name": "ERICA5779-Subscriber-5",
+              "isPermitted": false
+            },
+            {
+              "id": "ERICA5779-TestSub-PWT-103",
+              "name": "ERICA5779-TestSub-PWT-103",
+              "isPermitted": false
+            },
+            {
+              "id": "ERICA5779-Subscriber-2",
+              "name": "ERICA5779-Subscriber-2",
+              "isPermitted": false
+            },
+            {
+              "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+              "name": "SILVIA ROBBINS",
+              "isPermitted": true
+            },
+            {
+              "id": "ERICA5779-Subscriber-3",
+              "name": "ERICA5779-Subscriber-3",
+              "isPermitted": false
+            },
+            {
+              "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+              "name": "CRAIG/ROBERTS",
+              "isPermitted": false
+            }
+          ]
+        }
+      }
+    }
+
+  });
+});
diff --git a/vid-webpack-master/cypress/integration/iFrames/permission.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/permission.e2e.ts
new file mode 100644 (file)
index 0000000..225c12c
--- /dev/null
@@ -0,0 +1,116 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+import {ServiceModel} from '../../support/jsonBuilders/models/service.model';
+import {JsonBuilder} from '../../support/jsonBuilders/jsonBuilder';
+
+describe('Permissions ',  ()=> {
+  var jsonBuilderAndMock: JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+
+  beforeEach(() => {
+    cy.window().then((win) => {
+      win.sessionStorage.clear();
+      cy.preventErrorsOnLoading();
+      cy.initAAIMock();
+      cy.initVidMock();
+      cy.login();
+
+
+    });
+  });
+
+  afterEach(() => {
+    cy.screenshot();
+  });
+
+  it('user without permission get mode-view : is not permitted', () => {
+    const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+    const SERVICE_TYPE: string = "TYLER SILVIA";
+    const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+    const SERVICE_MODEL_ID: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+
+    cy.initDrawingBoardUserPermission(<any>{isEditPermitted : false});
+
+    cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/serviceModels/ecompNamingFalseModel.json').then((res) => {
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/rest/models/services/6b528779-44a3-4472-bdff-9cd15ec93450",
+        200,
+        0,
+        "ecompNamingFalseModel",
+      )
+    });
+
+    cy.readFile('../vid-automation/src/test/resources/VnfGroup/serviceWithVnfGroping_serviceInstance.json').then((res) => {
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + `**/aai_get_service_instance_topology/**`,
+        200, 0,
+        "serviceWithVnfGroping_serviceInstance",
+      )
+    });
+
+    cy.openIframe(`app/ui/#/servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}`);
+
+      cy.url().should('contains', 'VIEW')
+    });
+
+  it('user without permission get mode-view : is permitted', () => {
+    const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+    const SERVICE_TYPE: string = "TYLER SILVIA";
+    const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+    const SERVICE_MODEL_ID: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+
+    cy.initDrawingBoardUserPermission();
+
+    cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/serviceModels/ecompNamingFalseModel.json').then((res) => {
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/rest/models/services/6b528779-44a3-4472-bdff-9cd15ec93450",
+        200,
+        0,
+        "ecompNamingFalseModel",
+      )
+    });
+
+    cy.readFile('../vid-automation/src/test/resources/aaiGetInstanceTopology/getServiceInstanceTopologyResult.json').then((res) => {
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/aai_get_service_instance_topology/e433710f-9217-458d-a79d-1c7aff376d89/TYLER SILVIA/f8791436-8d55-4fde-b4d5-72dd2cf13cfb",
+        200, 0,
+        "initServiceInstanceTopology",
+      )
+    });
+    cy.openIframe(`app/ui/#/servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}`);
+
+    cy.url().should('contains', 'EDIT');
+    cy.getElementByDataTestsId('deployBtn').contains('UPDATE');
+    cy.getElementByDataTestsId('isViewOnly-status-test').contains('IN EDITING');
+  });
+
+  it(`RETRY - drawing board mode - no permission should show retry view only mode`,  () =>{
+    const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+    const SERVICE_TYPE: string = "TYLER SILVIA";
+    const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+    const SERVICE_MODEL_ID: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const JOB_ID: string = '123456-44a3-4472-bdff-9cd15ec12345';
+    cy.initDrawingBoardUserPermission(<any>{isEditPermitted : false});
+    cy.readFile('../vid-automation/src/test/resources/aaiGetInstanceTopology/getServiceInstanceTopologyResult.json').then((res) => {
+
+      // Adding VNF with isFailed.
+      res.vnfs["2017-388_ADIOD-vPE 0"].isFailed = true;
+      res.vnfs["2017-488_ADIOD-vPE 0"].isFailed = true;
+
+      // Adding VFModule with isFailed.
+      res.vnfs["2017-488_ADIOD-vPE 0"].vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"]["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].isFailed = true;
+
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/asyncInstantiation/bulkForRetry/" + JOB_ID,
+        200, 0,
+        "initServiceInstanceRetryTopology",
+      );
+      cy.openIframe(`app/ui/#/servicePlanning/RETRY_EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}&jobId=${JOB_ID}`);
+
+      cy.url().should('contains', '/RETRY?')
+    });
+  });
+});
diff --git a/vid-webpack-master/cypress/integration/iFrames/retry.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/retry.e2e.ts
new file mode 100644 (file)
index 0000000..cc64343
--- /dev/null
@@ -0,0 +1,199 @@
+///<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('Retry Page', function () {
+  let jsonBuilderAndMock: JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+  beforeEach(() => {
+    cy.window().then((win) => {
+      win.sessionStorage.clear();
+      cy.preventErrorsOnLoading();
+      cy.initAAIMock();
+      jsonBuilderAndMock.basicMock('/cypress/support/jsonBuilders/mocks/jsons/serviceModels/ecompNamingFalseModel.json',
+        Cypress.config('baseUrl') + "/rest/models/services/6b528779-44a3-4472-bdff-9cd15ec93450");
+      cy.initVidMock();
+      cy.initZones();
+      cy.permissionVidMock();
+      cy.login();
+    });
+  });
+
+  afterEach(() => {
+    cy.screenshot();
+  });
+
+  it(`RETRY - drawing board mode - should show correct failed icon with children + Retry button / Mock Data`,  ()=> {
+    const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+    const SERVICE_TYPE: string = "TYLER SILVIA";
+    const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+    const SERVICE_MODEL_ID: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const JOB_ID: string = '123456-44a3-4472-bdff-9cd15ec12345';
+    cy.readFile('../vid-automation/src/test/resources/aaiGetInstanceTopology/getServiceInstanceTopologyResult.json').then((res) => {
+      // Service with isFailed.
+      res.isFailed= true;
+      res.action = 'Create';
+      res.statusMessage = 'Service instantiation has failed.'
+      // Adding VNF with isFailed.
+      res.vnfs["2017-388_ADIOD-vPE 0"].isFailed = true;
+      res.vnfs["2017-488_ADIOD-vPE 0"].isFailed = true;
+      res.vnfs["2017-488_ADIOD-vPE 0"].statusMessage = 'VNF instantiation failed message';
+      res.vnfs["2017-388_ADIOD-vPE 0"].action = 'Create';
+      res.vnfs["2017-488_ADIOD-vPE 0"].action = 'Create';
+      res.networks["ExtVL 0"].action = 'Create';
+      res.networks["ExtVL 0"].statusMessage = 'Network instantiation failed message';
+
+      // Adding VFModule with isFailed.
+      res.vnfs["2017-488_ADIOD-vPE 0"].vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"]["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].isFailed = true;
+      res.vnfs["2017-488_ADIOD-vPE 0"].vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"]["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].statusMessage = 'Short vfModule Failure Message';
+      res.vnfs["2017-488_ADIOD-vPE 0"].vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"]["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].action = 'Create';
+
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/asyncInstantiation/bulkForRetry/" + JOB_ID,
+        200, 0,
+        "initServiceInstanceRetryTopology",
+      )
+    });
+
+    cy.openIframe(`app/ui/#/servicePlanning/RETRY_EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}&jobId=${JOB_ID}`);
+
+    cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').click();
+
+    cy.get('.failed-msg').should('have.length', 5);
+    cy.get('.newIcon').should('have.length', 4);
+
+    //cy.drawingBoardNumberOfExistingElementsShouldContains(4);
+    cy.get('.toggle-children-wrapper.toggle-children-wrapper-expanded').eq(0).click().then(()=>{
+      cy.get('.failed-msg').should('have.length', 5);
+      cy.get('.newIcon').should('have.length', 4);
+    });
+
+    cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-afacccf6-397d-45d6-b5ae-94c39734b168-2017-388_ADIOD-vPE 0')
+      .drawingBoardTreeClickOnContextMenuOptionByName('Edit')
+      .getElementByDataTestsId('cancelButton').click({force: true});
+    cy.drawingBoardTreeOpenContextMenuByElementDataTestId('node-afacccf6-397d-45d6-b5ae-94c39734b168-2017-388_ADIOD-vPE 0')
+      .drawingBoardTreeClickOnContextMenuOptionByName('Remove');
+
+    cy.get('.newIcon').should('have.length', 2);
+    cy.getElementByDataTestsId('isViewOnly-status-test').contains('IN EDITING');
+
+    cy.getElementByDataTestsId("openMenuBtn").click({force: true})
+      .getElementByDataTestsId("context-menu-header-edit-item").click({force: true})
+      .getElementByDataTestsId("serviceName").should('have.text','mCaNkinstancename')
+      .getElementByDataTestsId("subscriberName")
+      .getElementByDataTestsId("serviceType")
+      .getElementByDataTestsId("owningEntity")
+      .getElementByDataTestsId("project")
+      .getElementByDataTestsId("rollback")
+      .getElementByDataTestsId('cancelButton').click({force: true});
+    cy.getElementByDataTestsId("openMenuBtn").click({force: true})
+      .getElementByDataTestsId("context-menu-header-audit-item");
+    // button should be RETRY
+    cy.getElementByDataTestsId('deployBtn').should('contain', 'REDEPLOY');
+    cy.getElementByDataTestsId('deployBtn').should('not.have.attr', 'disabled');
+
+    cy.checkPopoverContentOnMouseEvent('service-failed-msg',  '.popover-content.popover-body','mouseenter', 0)
+      .should('contain', 'Service instantiation has failed');
+  });
+
+  it(`RETRY - view mode- should show failed icon with no actions enabled`, ()=> {
+    const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+    const SERVICE_TYPE: string = "TYLER SILVIA";
+    const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+    const SERVICE_MODEL_ID: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const JOB_ID: string = '123456-44a3-4472-bdff-9cd15ec12345';
+    cy.readFile('../vid-automation/src/test/resources/aaiGetInstanceTopology/getServiceInstanceTopologyResult.json').then((res) => {
+
+      // Adding VNF with isFailed.
+      res.vnfs["2017-388_ADIOD-vPE 0"].isFailed = true;
+      res.vnfs["2017-488_ADIOD-vPE 0"].isFailed = true;
+      res.vnfs["2017-388_ADIOD-vPE 0"].action = 'Create';
+      res.vnfs["2017-488_ADIOD-vPE 0"].action = 'Create';
+      res.vnfs["2017-488_ADIOD-vPE 0"].statusMessage = 'Very long message that checks the popoverwindow can show very very long messagewithout problem.as-erfderfd-rfghthth-yjyjyj-ukuk. For more details go to audit show window';
+      // Adding VFModule with isFailed.
+      res.vnfs["2017-488_ADIOD-vPE 0"].vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"]["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].isFailed = true;
+      res.vnfs["2017-488_ADIOD-vPE 0"].vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"]["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].action = 'Create';
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/responceForFailedInstance.json').then((res) => {
+        jsonBuilderAndMock.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/asyncInstantiation/auditStatusForRetry**",
+          200,
+          0,
+          "msoStatusForFailedInstance",
+        )
+      });
+
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/asyncInstantiation/bulkForRetry/" + JOB_ID,
+        200, 0,
+        "initServiceInstanceRetryTopology",
+      )
+    });
+
+    cy.openIframe(`app/ui/#/servicePlanning/RETRY?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}&jobId=${JOB_ID}`);
+
+    cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').click();
+
+    cy.get('.failed-msg').should('have.length', 4);
+    cy.get('.newIcon').should('have.length', 4);
+
+    cy.get('.toggle-children-wrapper.toggle-children-wrapper-expanded').eq(0).click().then(()=>{
+      cy.get('.failed-msg').should('have.length', 4);
+      cy.get('.newIcon').should('have.length', 4);
+    });
+    cy.assertMenuItemsForNode(['showAuditInfo'],'node-afacccf6-397d-45d6-b5ae-94c39734b168-2017-388_ADIOD-vPE 0-menu-btn');
+    cy.getElementByDataTestsId('isViewOnly-status-test').contains('VIEW ONLY');
+
+    // deploy button should be 'REDEPLOY' and disabled.
+    cy.getElementByDataTestsId('editBtn').should('contain', 'REDEPLOY').should('have.attr', 'disabled');
+
+    cy.checkPopoverContentOnMouseEvent('failed-error-message',  '.popover-content.popover-body','mouseenter', 0)
+      .should('not.be.visible');
+    cy.checkPopoverContentOnMouseEvent('failed-error-message',  '.popover-content.popover-body','mouseenter', 1)
+      .should('contain', 'Very long');
+
+  });
+
+  it(`RETRY - drawing board mode - should show correct failed icon + Retry button`, function () {
+    const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+    const SERVICE_TYPE: string = "TYLER SILVIA";
+    const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+    const SERVICE_MODEL_ID: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const JOB_ID: string = '123456-44a3-4472-bdff-9cd15ec12345';
+    let expectedResult: JSON;
+
+    cy.readFile('../vid-automation/src/test/resources/asyncInstantiation/ServiceTreeForRetry_serviceInstance.json').then((res) => {
+
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/asyncInstantiation/bulkForRetry/" + JOB_ID,
+        200, 0,
+        "initServiceInstanceRetryTopology",
+      )
+    });
+
+    //TODO - join this to correct API test
+
+
+
+    cy.openIframe(`app/ui/#/servicePlanning/RETRY_EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}&jobId=${JOB_ID}`);
+
+    cy.get('.failed-msg').should('have.length', 1);
+    cy.get('.newIcon').should('have.length', 1);
+    //TODO
+
+    cy.getElementByDataTestsId('deployBtn').should('not.have.attr', 'disabled');
+
+    // button should be RETRY
+    cy.getElementByDataTestsId('deployBtn').should('contain', 'REDEPLOY').click();
+
+
+    //TODO - join this to correct API test
+
+
+  });
+
+});
diff --git a/vid-webpack-master/cypress/integration/iFrames/searchExistingInstance.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/searchExistingInstance.e2e.ts
new file mode 100644 (file)
index 0000000..22e7a99
--- /dev/null
@@ -0,0 +1,87 @@
+///<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('search existing instance', function () {
+  var jsonBuilderAndMock: JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+
+  beforeEach(() => {
+    cy.window().then((win) => {
+      win.sessionStorage.clear();
+      cy.preventErrorsOnLoading();
+      cy.initAAIMock();
+      cy.initVidMock();
+      cy.initZones();
+      cy.permissionVidMock();
+      cy.login();
+    });
+  });
+
+  afterEach(() => {
+    cy.screenshot();
+  });
+
+  it('when find instance with resource group in the model then open new service planning in edit mode', function () {
+    const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+    const SUBSCRIBER_NAME:string ="SILVIA ROBBINS";
+    const SERVICE_TYPE: string = "VIRTUALUSP";
+    const SERVICE_INSTANCE_ID: string = "3d930d51-eed8-41b8-956f-70aa0d19940b";
+    const SERVICE_MODEL_VERSION_ID: string = '5aece664-e92d-4a99-8a76-c7d7b8d23d09';
+    const SERVICE_MODEL_INVARIANT_ID: string = 'd089c740-53ac-41f6-8e5b-32e862302ef1';
+
+    var searchServiceInstancesResponse = {
+      "service-instances": [{
+        "serviceInstanceId":SERVICE_INSTANCE_ID,
+        "globalCustomerId": SUBSCRIBER_ID,
+        "serviceType": SERVICE_TYPE,
+        "serviceInstanceName": "abc_mdns_2017_1011_IST_Service_CSI",
+        "subscriberName": SUBSCRIBER_NAME,
+        "aaiModelInvariantId": SERVICE_MODEL_INVARIANT_ID,
+        "aaiModelVersionId": SERVICE_MODEL_VERSION_ID,
+        "isPermitted": true
+      }
+      ]
+    };
+
+    cy.readFile('../vid-automation/src/test/resources/aaiGetInstanceTopology/getServiceInstanceTopologyResult.json').then((res) => {
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/aai_get_service_instance_topology/e433710f-9217-458d-a79d-1c7aff376d89/TYLER SILVIA/f8791436-8d55-4fde-b4d5-72dd2cf13cfb",
+        200, 0,
+        "initServiceInstanceTopology",
+      )
+    });
+
+    cy.server()
+      .route({
+        method: 'GET',
+        status: 200,
+        delay : 0,
+        url: Cypress.config('baseUrl') + `/search_service_instances?subscriberId=${SUBSCRIBER_ID}&serviceInstanceIdentifier=${SERVICE_INSTANCE_ID}`,
+        response: searchServiceInstancesResponse
+      }).as('search_service_instances');
+
+    cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/serviceModels/serviceForNewViewEdit.json').then((res) => {
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + `/rest/models/services/${SERVICE_MODEL_VERSION_ID}`,
+        200,
+        0,
+        "serviceForNewViewEdit",
+        (res: ServiceModel)=>{
+          res.service.uuid = SERVICE_MODEL_VERSION_ID;
+          res.service.invariantUuid =SERVICE_MODEL_INVARIANT_ID;
+          return res;
+        }
+      )
+    });
+
+    cy.visit(`/serviceModels.htm#/instances/subdetails?subscriberId=${SUBSCRIBER_ID}&serviceInstanceIdentifier=${SERVICE_INSTANCE_ID}`);
+    cy.getElementByDataTestsId(`view/edit-test-data-id-${SERVICE_INSTANCE_ID}`).click();
+    cy.url().should('contains',`servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_VERSION_ID}&subscriberId=${SUBSCRIBER_ID}`+
+      `&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}`);
+  });
+
+});
+
index 9d1fbfd..8b9239c 100644 (file)
@@ -13,40 +13,71 @@ describe('Service popup', function () {
       })
     });
 
+    afterEach(() => {
+      cy.screenshot();
+    });
+
+    it('a-la-carte service instantiation popup has all required fields ', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res1) => {
+        res1.service.serviceHierarchy["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].service.instantiationType = 'A-LA-Carte';
+        cy.setReduxState(<any>res1);
+        cy.openIframe('/app/ui/#/servicePopup?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd&isCreate=true');
+        cy.isElementContainsAttr('form-set', 'disabled');
+        cy.get('label').contains('Instance name:').should('not.have.class', 'required')
+          .get('label').contains('Subscriber name:').should('have.class', 'required')
+          .get('label').contains('Service type:').should('have.class', 'required')
+          .get('label').contains('Owning entity:').should('have.class', 'required')
+          .get('label').contains('Project').should('not.have.class', 'required')
+          .get('label').contains('Rollback on failure').should('have.class', 'required');
+      });
+    });
+
+    it('a-la-carte service instantiation popup has Instance name as required', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res1) => {
+        res1.service.serviceHierarchy["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].service.instantiationType = 'A-LA-Carte';
+        let isEcompNaming = false;
+        res1.service.serviceHierarchy["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].service.serviceEcompNaming = isEcompNaming.toString();
+        cy.setReduxState(<any>res1);
+        cy.openIframe('/app/ui/#/servicePopup?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd&isCreate=true');
+        cy.isElementContainsAttr('form-set', 'disabled');
+        cy.get('label').contains('Instance name:').should('have.class', 'required');
+      });
+    });
+
     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.isElementContainsAttr('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('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');
+        .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('subscriberName', 'SILVIA ROBBINS');
+      cy.selectDropdownOptionByText('serviceType', 'TYLER SILVIA');
+      cy.selectDropdownOptionByText('productFamily', 'TYLER SILVIA');
+      cy.selectDropdownOptionByText('lcpRegion', 'hvf6');
+      cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-testalexandria');
       cy.selectDropdownOptionByText('aic_zone', 'NFTJSSSS-NFT1');
-      cy.selectDropdownOptionByText('project', 'DFW');
+      cy.selectDropdownOptionByText('project', 'WATKINS');
       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.initCategoryParameter(<any>{});
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res1) => {
+        res1.service.categoryParameters.owningEntityList = [];
+        cy.setReduxState(<any>res1);
         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.');
@@ -55,3 +86,4 @@ describe('Service popup', function () {
     });
   });
 });
+
diff --git a/vid-webpack-master/cypress/integration/iFrames/serviceWithNetwork.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/serviceWithNetwork.e2e.ts
new file mode 100644 (file)
index 0000000..678609c
--- /dev/null
@@ -0,0 +1,105 @@
+///<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('test view service with network', () => {
+    var jsonBuilderAAIService : JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+    const presetsPrefix : string = '/cypress/support/jsonBuilders/mocks/jsons/';
+
+    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(presetsPrefix + 'serviceWithNetwork/serviceWithNetwork.json').then((res) => {
+        jsonBuilderAAIService.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/rest/models/services/5a3ad576-c01d-4bed-8194-0e72b4a3d020",
+          200, 0,
+          "service-complexService")
+      });
+      cy.readFile(presetsPrefix + 'serviceWithNetwork/aaiSubViewEditForServiceWithNetwork.json').then((res) => {
+        jsonBuilderAAISubViewEditModel.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_sub_viewedit/**",
+          200,
+          0,
+          "aai-sub-view-edit")
+      });
+      cy.readFile(presetsPrefix + 'serviceWithNetwork/aaiSubDetailsForServiceWithNetwork.json').then((res) => {
+        jsonBuilderAAISubDetailsModel.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_sub_details/**",
+          200,
+          0,
+          "aai-sub-details")
+      });
+      cy.readFile(presetsPrefix + 'aaiServiceInstancePnfs.json').then((res) => {
+        jsonBuilderPNF.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_get_service_instance_pnfs/**",
+          200,
+          0,
+          "aai-get-service-instance-pnfs")
+      });
+      cy.readFile(presetsPrefix + 'serviceWithNetwork/aaiServiceInstances.json').then((res) => {
+        jsonBuilderAaiServiceInstances.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/search_service_instances**",
+          200,
+          0,
+          "aai-get-service-instances")
+      });
+      cy.readFile(presetsPrefix + 'emptyObjectResponse.json').then((res) => {
+        jsonBuilderEmpty.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_getPortMirroringConfigsData**",
+          200,
+          0,
+          "aai_getPortMirroringConfigsDate - empty response")
+      });
+      cy.readFile(presetsPrefix + 'emptyObjectResponse.json').then((res) => {
+        jsonBuilderEmpty.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_getPortMirroringSourcePorts**",
+          200,
+          0,
+          "aai_getPortMirroringSourcePorts - empty response")
+      });
+      cy.readFile('../vid-automation/src/test/resources/serviceWithNetwork/aaiGetNetworksToVlansByServiceInstance.json').then((res) => {
+        jsonBuilderAAIService.basicJson(
+          res,
+          Cypress.config('baseUrl') + '/aai/standardQuery/vlansByNetworks?' +
+              'globalCustomerId=a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb' +
+              '&serviceType=vMOG' +
+              '&serviceInstanceId=9cdd1b2a-43a7-47bc-a88e-759ba2399f0b' +
+              '&sdcModelUuid=5a3ad576-c01d-4bed-8194-0e72b4a3d020',
+          200,
+          0,
+          "aai-aaiGetNetworksToVlans-By-Service-Instance")
+      });
+
+      cy.initVidMock(); // just for subsequent "initFlags()"
+      cy.login();
+    });
+
+    afterEach(() => {
+      cy.screenshot();
+    });
+
+    it(`should allow delete network on view edit`, function () {
+      cy.visit('/serviceModels.htm#/instantiate?subscriberId=a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb&subscriberName=Mobility&serviceType=vMOG&serviceInstanceId=9cdd1b2a-43a7-47bc-a88e-759ba2399f0b&aaiModelVersionId=5a3ad576-c01d-4bed-8194-0e72b4a3d020&isPermitted=true');
+       cy.wait('@aai_getPortMirroringSourcePorts - empty response');
+      cy.getElementByDataTestsId("deleteNetworkButton").should('not.have.attr', 'disabled');
+      cy.get(".vlansTreeNode").should('have.length', 2);
+    });
+  });
+
+});
+
diff --git a/vid-webpack-master/cypress/integration/iFrames/serviceWithVnfNetwork.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/serviceWithVnfNetwork.e2e.ts
new file mode 100644 (file)
index 0000000..f6984a2
--- /dev/null
@@ -0,0 +1,94 @@
+///<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('Service With VNF network', 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/**/**/**/3f93c7cb-2fd0-4557-9514-e189b7b04f9d",
+          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/aaiServiceInstances.json').then((res) => {
+        jsonBuilderAaiServiceInstances.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/search_service_instances**",
+          200,
+          0,
+          "aai-get-service-instances")
+      });
+
+      cy.readFile('../vid-automation/src/test/resources/serviceWithNetwork/aaiGetNetworksWithVlansToVnfByServiceInstance.json').then((res) => {
+        jsonBuilderAAIService.basicJson(
+          res,
+          Cypress.config('baseUrl') + '/aai/standardQuery/vlansByNetworks?' +
+          'globalCustomerId=e433710f-9217-458d-a79d-1c7aff376d89' +
+          '&serviceType=TYLER SILVIA' +
+          '&serviceInstanceId=3f93c7cb-2fd0-4557-9514-e189b7b04f9d' +
+          '&sdcModelUuid=6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+          200,
+          0,
+          "aai-aaiGetNetworksToVlans-By-Service-Instance")
+      });
+
+      cy.initVidMock(); // just for subsequent "initFlags()"
+
+      cy.login();
+    });
+
+    afterEach(() => {
+      cy.screenshot();
+    });
+
+    it(`Display VNF's network and its vlans hierarchically`, function () {
+      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');
+      cy.get('div').contains('VNF: fsd')
+        .get('div').contains('NETWORK: AAAAABBBBCCCC')
+        .get('div').contains('NETWORK: DDDEEEE')
+        .get('.vlansTreeNode').should('have.length', 4);
+    });
+  });
+
+  function changeServiceModel(serviceModel: ServiceModel) {
+    serviceModel.service.uuid = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    return serviceModel;
+  }
+});
+
diff --git a/vid-webpack-master/cypress/integration/iFrames/softDeleteAndResume.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/softDeleteAndResume.e2e.ts
new file mode 100644 (file)
index 0000000..53e5e13
--- /dev/null
@@ -0,0 +1,241 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+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('Soft delete tests', 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 jsonBuilderAaiServiceInstances: JsonBuilder<AaiServiceInstancesModel> = new JsonBuilder<AaiServiceInstancesModel>();
+    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/aaiSubViewEditForServiceWithSomeVFModule.json').then((res) => {
+        jsonBuilderAAISubViewEditModel.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_sub_viewedit/**/**/**/3f93c7cb-2fd0-4557-9514-e189b7b04f9d",
+          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/aaiServiceInstances.json').then((res) => {
+        jsonBuilderAaiServiceInstances.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/search_service_instances**",
+          200,
+          0,
+          "aai-get-service-instances")
+      });
+
+      cy.initVidMock();
+
+      cy.initTenants();
+
+      cy.login();
+    });
+
+    afterEach(() => {
+      cy.screenshot();
+    });
+
+    it(`Soft delete button will be display also if base module is true`, function () {
+      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');
+      checkSoftDeleteAndDeletePopup('aa', 'vfModuleTreeNode-pendingactivation', true, true);
+    });
+
+    it(`Soft delete button not display in assigned orch status`, function () {
+      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');
+      checkSoftDeleteAndDeletePopup('gg', 'vfModuleTreeNode-assigned', false, true);
+    });
+
+    it(`Resume button display in orch status - pendingactivation, assigned - feature FLAG_VF_MODULE_RESUME_STATUS_CREATE - is OFF`, function () {
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/flags.json').then((res) => {
+        cy.server()
+          .route({
+            method: 'GET',
+            delay :  0,
+            status :  200,
+            url : Cypress.config('baseUrl') + "/flags**",
+            response : {
+              "FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE": true,
+              "FLAG_VF_MODULE_RESUME_STATUS_CREATE": false
+            }
+          }).as('initFlags');
+      });
+
+      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');
+
+      checkResumeAndPopup('aa', 'vfModuleTreeNode-pendingactivation');
+      checkResumeAndPopup('gg', 'vfModuleTreeNode-assigned');
+
+      cy.get('.vfModuleTreeNode-created')
+        .getElementByDataTestsId('resumeVFModuleButton-ABC').should('not.be.visible');
+      cy.get('.vfModuleTreeNode-pending-delete')
+        .getElementByDataTestsId('resumeVFModuleButton-my_vfModule').should('not.be.visible');
+
+    });
+
+    it(`Resume button display in orch status - pendingactivation, assigned, created - feature FLAG_VF_MODULE_RESUME_STATUS_CREATE - is ON`, function () {
+
+      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');
+
+      checkResumeAndPopup('aa', 'vfModuleTreeNode-pendingactivation');
+      checkResumeAndPopup('gg', 'vfModuleTreeNode-assigned');
+      checkResumeAndPopup('ABC', 'vfModuleTreeNode-created');
+
+      cy.get('.vfModuleTreeNode-pending-delete')
+        .getElementByDataTestsId('resumeVFModuleButton-my_vfModule').should('not.be.visible');
+
+    });
+
+    it(`Delete popup with not homing data from AAI`, function () {
+      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');
+      checkSoftDeleteAndDeletePopup('gg', 'vfModuleTreeNode-assigned', false, true);
+      cy.selectDropdownOptionByText('lcpRegion', 'JANET25');
+      cy.getElementByDataTestsId('confirmResumeDeleteButton').should('have.attr', 'disabled');
+      cy.typeToInput("lcpRegionText", "just another region");
+      cy.getElementByDataTestsId('confirmResumeDeleteButton').should('have.attr', 'disabled');
+      cy.selectDropdownOptionByText('tenant', 'USP-SIP-IC-24335-T-01');
+      cy.getElementByDataTestsId('confirmResumeDeleteButton').should('not.have.attr', 'disabled');
+      cy.selectDropdownOptionByText('lcpRegion', 'hvf6');
+      cy.getElementByDataTestsId('confirmResumeDeleteButton').should('have.attr', 'disabled');
+      cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-testalexandria');
+      cy.getElementByDataTestsId('confirmResumeDeleteButton').should('not.have.attr', 'disabled');
+      cy.getElementByDataTestsId('cancel').click({force: true})
+      cy.getElementByDataTestsId('confirmResumeDeleteButton').should('not.be.visible');
+    });
+
+    it(`Soft delete button display with partial homing data from AAI`, function () {
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiGetHomingData.json').then((res) => {
+        jsonBuilderAaiServiceInstances.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_get_homing_by_vfmodule/c015cc0f-0f37-4488-aabf-53795fd93cd3/a231a99c-7e75-4d6d-a0fb-5c7d26f30f77",
+          200,
+          0,
+          "aai-get-homing-data")
+      });
+
+
+      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');
+      checkSoftDeleteAndDeletePopup('my_vfModule', 'vfModuleTreeNode-pending-delete', true, true);
+      cy.getElementByDataTestsId('lcpRegionText').should('be.visible');
+      cy.getElementByDataTestsId('lcpRegion').contains('JANET25');
+      cy.getElementByDataTestsId('tenant').contains('USP-SIP-IC-24335-T-01');
+    });
+
+    it(`Soft delete button display with with homing data from AAI`, function () {
+
+      cy.readFile('../vid-automation/src/test/resources/viewEdit/aaiHomingDataResponse.json').then((res) => {
+        jsonBuilderAaiServiceInstances.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_get_homing_by_vfmodule/0846287b-65bf-45a6-88f6-6a1af4149fac/a9b70ac0-5917-4203-a308-0e6920e6d09b",
+          200,
+          0,
+          "aai-get-homing-data")
+      });
+
+      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');
+      checkSoftDeleteAndDeletePopup('vf_module2', 'vfModuleTreeNode-pendingcreate', true, false);
+    });
+
+    it(`Soft delete and Delete - Mega region is JANET25 - not 'olson3', 'olson5a'`, function () {
+      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');
+      //Delete
+      checkSoftDeleteAndDeletePopup('gg', 'vfModuleTreeNode-assigned', false, true);
+      checkLegacyRegion();
+      cy.getElementByDataTestsId('cancel').click();
+      //Soft delete
+      checkSoftDeleteAndDeletePopup('aa', 'vfModuleTreeNode-pendingactivation', true, true);
+      checkLegacyRegion();
+      cy.getElementByDataTestsId('cancel').click();
+      //Resume
+      cy.get('div').find('.vfModuleTreeNode-pendingactivation')
+        .getElementByDataTestsId('resumeVFModuleButton-aa').click().then(()=> {
+        checkLegacyRegion();
+      });
+    });
+
+    function checkLegacyRegion() {
+      checkIsLegacyRegionTextIsDisplay('JANET25', true);
+      checkIsLegacyRegionTextIsDisplay('olson3', false);
+      checkIsLegacyRegionTextIsDisplay('olson5a', false);
+      checkIsLegacyRegionTextIsDisplay('hvf6', false);
+    }
+
+    function checkIsLegacyRegionTextIsDisplay(lcpRegionName: string, isVisible: boolean) {
+      const isVisibleText = isVisible ? 'be.visible' : 'not.be.visible';
+      cy.selectDropdownOptionByText('lcpRegion', lcpRegionName);
+      cy.getElementByDataTestsId('lcpRegionText').should(isVisibleText);
+
+    }
+
+    function checkResumeAndPopup(vfModuleName:string, vfModuleClassName:string)  {
+      cy.get('div').find('.' + vfModuleClassName)
+        .getElementByDataTestsId('resumeVFModuleButton-' + vfModuleName).click().then(()=> {
+        cy.getElementByDataTestsId('confirmResumeDeleteButton').should('be.visible')
+          .getElementByDataTestsId('softDeleteButton').should('not.be.visible')
+          .getElementByDataTestsId('lcpRegion').should('be.visible')
+          .getElementByDataTestsId('tenant').should('be.visible')
+          .getElementByDataTestsId('modalTitle').contains('Instantiate')
+          .getElementByDataTestsId('confirmResumeDeleteButton').contains('Instantiate')
+          .getElementByDataTestsId('cancel').click();
+      });
+    }
+
+    function checkSoftDeleteAndDeletePopup(vfModuleName:string, vfModuleClassName:string, softDeleteEnable:boolean, isNoHomingData:boolean)  {
+      const visibleString = 'be.visible';
+      const NOT = 'not.';
+      const softDeleteVisibleString = (softDeleteEnable) ? visibleString : NOT + visibleString;
+      const isNoHomingDataVisibleString = (isNoHomingData) ? visibleString : NOT + visibleString;
+      cy.get('div').find('.' + vfModuleClassName)
+        .getElementByDataTestsId('deleteVFModuleButton-' + vfModuleName).click({force: true}).then(()=> {
+        cy.getElementByDataTestsId('confirmResumeDeleteButton').should('be.visible')
+          .getElementByDataTestsId('softDeleteButton').should(softDeleteVisibleString)
+          .getElementByDataTestsId('lcpRegion').should(isNoHomingDataVisibleString)
+          .getElementByDataTestsId('tenant').should(isNoHomingDataVisibleString);
+      });
+    }
+  });
+
+
+
+  function changeServiceModel(serviceModel: ServiceModel) {
+    serviceModel.service.uuid = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    return serviceModel;
+  }
+});
+
index 7b848ba..62fd86b 100644 (file)
@@ -7,6 +7,10 @@ describe('Tenant isolation - Test Environments Page', function () {
       cy.login();
     });
 
+    afterEach(() => {
+      cy.screenshot();
+    });
+
     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');
index e589b1e..813934e 100644 (file)
@@ -1,10 +1,10 @@
 ///<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';
+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', () => {
@@ -25,10 +25,79 @@ describe('View Edit Page', function () {
           "service-complexService",
           changeServiceModel)
       });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicFabricConfigService.json').then((res) => {
+        jsonBuilderAAIService.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/rest/models/services/6e59c5de-f052-46fa-aa7e-2fca9d671234",
+          200, 0,
+          "service-FabricConfig", changeFabric)
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/activeFabricConfigService.json').then((res) => {
+        jsonBuilderAAIService.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/rest/models/services/6e59c5de-f052-46fa-aa7e-2fca9d675678",
+          200, 0,
+          "service-FabricConfig", changeFabric)
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/createdFabricConfigService.json').then((res) => {
+        jsonBuilderAAIService.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/rest/models/services/6e59c5de-f052-46fa-aa7e-2fca9d679000",
+          200, 0,
+          "service-FabricConfig", changeFabric)
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/deactivatedFabricConfigService.json').then((res) => {
+        jsonBuilderAAIService.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/rest/models/services/6e59c5de-f052-46fa-aa7e-2fca9d671000",
+          200, 0,
+          "service-FabricConfig", changeFabric)
+      });
+
       cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForComplexService.json').then((res) => {
         jsonBuilderAAISubViewEditModel.basicJson(
           res,
-          Cypress.config('baseUrl') + "/aai_sub_viewedit/**",
+          Cypress.config('baseUrl') + "/aai_sub_viewedit/**/**/**/3f93c7cb-2fd0-4557-9514-e189b7b04f9d",
+          200,
+          0,
+          "aai-sub-view-edit")
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForFabricConfigService.json').then((res) => {
+        jsonBuilderAAISubViewEditModel.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_sub_viewedit/**/**/**/c187e9fe-40c3-4862-b73e-84ff056205f61234",
+          200,
+          0,
+          "aai-sub-view-edit")
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForActiveFabricConfigService.json').then((res) => {
+        jsonBuilderAAISubViewEditModel.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_sub_viewedit/**/**/**/c187e9fe-40c3-4862-b73e-84ff056205f65678",
+          200,
+          0,
+          "aai-sub-view-edit")
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForCreatedFabricConfigService.json').then((res) => {
+        jsonBuilderAAISubViewEditModel.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_sub_viewedit/**/**/**/c187e9fe-40c3-4862-b73e-84ff056205f69000",
+          200,
+          0,
+          "aai-sub-view-edit")
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForDeactivatedFabricConfigService.json').then((res) => {
+        jsonBuilderAAISubViewEditModel.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_sub_viewedit/**/**/**/c187e9fe-40c3-4862-b73e-84ff056205f61000",
           200,
           0,
           "aai-sub-view-edit")
@@ -82,11 +151,16 @@ describe('View Edit Page', function () {
       cy.login();
     });
 
+    afterEach(() => {
+      cy.screenshot();
+    });
 
     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');
+      cy.wait('@aai_getPortMirroringConfigsDate - empty response');
+      cy.get('div').contains('VOLUME GROUP: f'); // waits for the view/edit to be ready after ports' redraw
       typesToIncludeModel.forEach((type) => {
         cy.get('.' + type + '-info').click({force: true});
         cy.getElementByDataTestsId("Model Version").contains('1.0');
@@ -94,8 +168,45 @@ describe('View Edit Page', function () {
         cy.getElementByDataTestsId("detailsCloseBtn").click();
       });
     });
+
+    it(`Check fabric configuration service with some configuration with diff orchStatus`, function () {
+      cy.visit('/serviceModels.htm#/instantiate?subscriberId=e433710f-9217-458d-a79d-1c7aff376d89&subscriberName=USP%20VOICE&serviceType=VIRTUAL%20USP&serviceInstanceId=c187e9fe-40c3-4862-b73e-84ff056205f61234&aaiModelVersionId=6e59c5de-f052-46fa-aa7e-2fca9d671234&isPermitted=true');
+      cy.wait('@service-FabricConfig');
+      cy.get('.error-msg').should("be.visible").should('contain','Activate fabric configuration button is not available as some of the configuration objects are not in Assigned status. Check MSO logs for the reasons for this abnormal case.');
+      cy.getElementByDataTestsId("activateFabricConfigurationButton").should('have.attr', 'disabled');
+      cy.getElementByDataTestsId("activateButton").should("not.be.visible");
+    });
+
+    it(`Check fabric configuration service with active status`, function () {
+      cy.visit('/serviceModels.htm#/instantiate?subscriberId=e433710f-9217-458d-a79d-1c7aff376d89&subscriberName=USP%20VOICE&serviceType=VIRTUAL%20USP&serviceInstanceId=c187e9fe-40c3-4862-b73e-84ff056205f65678&aaiModelVersionId=6e59c5de-f052-46fa-aa7e-2fca9d671234&isPermitted=true');
+      cy.wait('@service-FabricConfig');
+      cy.getElementByDataTestsId("activateFabricConfigurationButton").should('not.be.visible');
+      cy.getElementByDataTestsId("activateButton").should('have.attr', 'disabled');
+      cy.getElementByDataTestsId("deactivateButton").should("be.visible");
+    });
+
+    it(`Check fabric configuration service with created status`, function () {
+      cy.visit('/serviceModels.htm#/instantiate?subscriberId=e433710f-9217-458d-a79d-1c7aff376d89&subscriberName=USP%20VOICE&serviceType=VIRTUAL%20USP&serviceInstanceId=c187e9fe-40c3-4862-b73e-84ff056205f69000&aaiModelVersionId=6e59c5de-f052-46fa-aa7e-2fca9d679000&isPermitted=true');
+      cy.wait('@service-FabricConfig');
+      cy.getElementByDataTestsId("activateFabricConfigurationButton").should('not.be.visible');
+      cy.getElementByDataTestsId("activateButton").should('have.attr', 'disabled');
+      cy.getElementByDataTestsId("deactivateButton").should("be.visible");
+    });
+
+    it(`Check fabric configuration service with pendingdeLete status`, function () {
+      cy.visit('/serviceModels.htm#/instantiate?subscriberId=e433710f-9217-458d-a79d-1c7aff376d89&subscriberName=USP%20VOICE&serviceType=VIRTUAL%20USP&serviceInstanceId=c187e9fe-40c3-4862-b73e-84ff056205f61000&aaiModelVersionId=6e59c5de-f052-46fa-aa7e-2fca9d671000&isPermitted=true');
+      cy.wait('@service-FabricConfig');
+      cy.getElementByDataTestsId("activateFabricConfigurationButton").should('not.be.visible');
+      cy.getElementByDataTestsId("activateButton").should('not.have.attr', 'disabled');
+      cy.getElementByDataTestsId("deactivateButton").should('have.attr', 'disabled');
+    });
   });
 
+  function changeFabric(serviceModel: ServiceModel) {
+    serviceModel.service.uuid = "6e59c5de-f052-46fa-aa7e-2fca9d671234";
+    return serviceModel;
+  }
+
   function changeServiceModel(serviceModel: ServiceModel) {
     serviceModel.service.uuid = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
     serviceModel.vnfs = {
@@ -109,7 +220,7 @@ describe('View Edit Page', function () {
         "inputs": {},
         "commands": {},
         "properties": {
-          "gpb2_Internal2_mac": "00:80:37:0E:02:22",
+          "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
           "sctp-b-ipv6-egress_src_start_port": "0",
           "sctp-a-ipv6-egress_rule_application": "any",
           "Internal2_allow_transit": "true",
@@ -117,9 +228,9 @@ describe('View Edit Page', function () {
           "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",
+          "ncb2_Internal1_mac": "00:11:22:EF:AC:DF",
           "sctp-b-ipv6-ingress-src_start_port": "0.0",
-          "ncb1_Internal2_mac": "00:80:37:0E:09:12",
+          "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
           "fsb_volume_size_0": "320.0",
           "sctp-b-egress_src_addresses": "local",
           "sctp-a-ipv6-ingress_ethertype": "IPv4",
@@ -138,12 +249,12 @@ describe('View Edit Page', function () {
           "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",
+          "gpb1_Internal1_mac": "00:11:22:EF:AC:DF",
           "sctp-b-egress_dst_subnet_prefix_len": "0.0",
-          "Internal2_net_cidr": "169.255.0.0",
+          "Internal2_net_cidr": "10.0.0.10",
           "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",
+          "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
           "sctp-a-egress_ethertype": "IPv4",
           "vlc_st_service_mode": "in-network-nat",
           "sctp-a-ipv6-egress_ethertype": "IPv4",
@@ -153,10 +264,10 @@ describe('View Edit Page', function () {
           "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",
+          "fsb2_Internal1_mac": "00:11:22:EF:AC:DF",
           "sctp-a-ipv6-ingress-src_start_port": "0.0",
           "sctp-b-ipv6-egress_ethertype": "IPv4",
-          "Internal1_net_cidr": "169.253.0.0",
+          "Internal1_net_cidr": "10.0.0.10",
           "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
           "fsb_flavor_name": "nv.c20r64d1",
           "sctp_rule_protocol": "132",
@@ -164,7 +275,7 @@ describe('View Edit Page', function () {
           "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",
+          "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
           "vlc_st_virtualization_type": "virtual-machine",
           "sctp-b-ingress-dst_start_port": "0.0",
           "sctp-b-ingress-dst_end_port": "65535.0",
@@ -182,7 +293,7 @@ describe('View Edit Page', function () {
           "Internal2_shared": "false",
           "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
           "Internal2_rpf": "disable",
-          "vlc1_Internal1_mac": "00:80:37:0E:01:12",
+          "vlc1_Internal1_mac": "00:11:22:EF:AC:DF",
           "sctp-b-ipv6-egress_src_end_port": "65535",
           "sctp-a-ipv6-egress_src_addresses": "local",
           "sctp-a-ingress-dst_end_port": "65535.0",
@@ -192,41 +303,41 @@ describe('View Edit Page', function () {
           "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",
+          "ncb1_Internal1_mac": "00:11:22:EF:AC:DF",
           "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",
+          "fsb2_Internal2_mac": "00:11:22:EF:AC:DF",
           "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
           "Internal1_net_cidr_len": "17",
-          "gpb2_Internal1_mac": "00:80:37:0E:02:22",
+          "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
           "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",
+          "ncb2_Internal2_mac": "00:11:22:EF:AC:DF",
           "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",
+          "gpb1_Internal2_mac": "00:11:22:EF:AC:DF",
           "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",
+          "fsb1_Internal1_mac": "00:11:22:EF:AC:DF",
           "vlc_st_interface_type_oam": "management",
           "multi_stage_design": "false",
           "oam_sec_group_name": "oam-sec-group",
-          "Internal2_net_gateway": "169.255.0.3",
+          "Internal2_net_gateway": "10.0.0.10",
           "sctp-a-ipv6-ingress-dst_end_port": "65535",
           "sctp-b-ipv6-egress-dst_start_port": "0",
-          "Internal1_net_gateway": "169.253.0.3",
+          "Internal1_net_gateway": "10.0.0.10",
           "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",
@@ -248,7 +359,7 @@ describe('View Edit Page', function () {
           "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",
+          "vlc2_Internal2_mac": "00:11:22:EF:AC:DF",
           "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",
@@ -260,7 +371,7 @@ describe('View Edit Page', function () {
           "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",
+          "vlc1_Internal2_mac": "00:11:22:EF:AC:DF",
           "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
           "sctp-a-ipv6-ingress_action": "pass",
           "Internal1_rpf": "disable",
diff --git a/vid-webpack-master/cypress/integration/iFrames/viewOnlyDrawingBoard.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/viewOnlyDrawingBoard.e2e.ts
new file mode 100644 (file)
index 0000000..d15809d
--- /dev/null
@@ -0,0 +1,315 @@
+///<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';
+import {AsyncInstantiationModel} from "../../support/jsonBuilders/models/asyncInstantiation.model";
+
+describe('View only drawing board', function () {
+  var jsonBuilderAndMock: JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+
+  var jsonBuilderInstantiationBuilder: JsonBuilder<AsyncInstantiationModel> = new JsonBuilder<AsyncInstantiationModel>();
+
+  beforeEach(() => {
+    cy.window().then((win) => {
+      win.sessionStorage.clear();
+      cy.preventErrorsOnLoading();
+      cy.initAAIMock();
+      cy.initVidMock();
+      cy.initZones();
+      cy.permissionVidMock();
+      cy.login();
+    });
+  });
+
+  afterEach(() => {
+    cy.screenshot();
+  });
+
+  it('error should display on api error', function () {
+    const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+    const SERVICE_TYPE: string = "TYLER SILVIA";
+    const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+    const SERVICE_MODEL_ID: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+
+    cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/serviceModels/ecompNamingFalseModel.json').then((res) => {
+      jsonBuilderInstantiationBuilder.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/rest/models/services/6b528779-44a3-4472-bdff-9cd15ec93450",
+        500,
+        0,
+        "error 500 getServiceInstanceTopology"
+      );
+
+      cy.openIframe(`app/ui/#/servicePlanning/VIEW?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}`);
+
+      cy.get('div.title')
+        .contains('Server not available');
+
+    });
+  });
+
+  it(`when open service planning in view mode service instance is shown as expected`, function () {
+    const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+    const SERVICE_TYPE: string = "TYLER SILVIA";
+    const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+    const SERVICE_MODEL_ID: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+
+    cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/serviceModels/ecompNamingFalseModel.json').then((res) => {
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/rest/models/services/6b528779-44a3-4472-bdff-9cd15ec93450",
+        200,
+        0,
+        "ecompNamingFalseModel",
+      )
+    });
+
+    cy.readFile('../vid-automation/src/test/resources/aaiGetInstanceTopology/getServiceInstanceTopologyResult.json').then((res) => {
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/aai_get_service_instance_topology/e433710f-9217-458d-a79d-1c7aff376d89/TYLER SILVIA/f8791436-8d55-4fde-b4d5-72dd2cf13cfb",
+        200, 0,
+        "initServiceInstanceTopology",
+      )
+    });
+
+    cy.openIframe(`app/ui/#/servicePlanning/VIEW?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}`);
+    //cy.visit("welcome.htm"); //relaod page to not break the following tests
+
+    //testing left side
+    cy.getElementByDataTestsId('node-2017-388_ADIOD-vPE 1').find(`[data-tests-id='node-type-indicator']`).should('have.text', 'VNF');
+    cy.getElementByDataTestsId('node-2017-488_ADIOD-vPE 0').click({force: true});
+    cy.getElementByDataTestsId('node-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1').find(`[data-tests-id='node-type-indicator']`).should('have.text', 'M');
+
+    //testing right side
+    cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').find(`[data-tests-id='node-type-indicator']`).should('have.text', 'VNF');
+    cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').click({force: true});
+    cy.getElementByDataTestsId('node-f8360508-3f17-4414-a2ed-6bc71161e8db-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0').eq(0).find(`[data-tests-id='node-type-indicator']`).should('have.text', 'M');
+
+    //check vnf node tree sub header
+    cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').find("[data-tests-id='status-property-orchStatus']").should('have.text', 'Created');
+    cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').find("[data-tests-id='status-property-provStatus']").should('have.text', '');
+    cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').find("[data-tests-id='status-property-inMaint']").should('not.exist');
+
+    //check vf Module node tree sub header
+    cy.getElementByDataTestsId('node-f8360508-3f17-4414-a2ed-6bc71161e8db-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0').find("[data-tests-id='status-property-provStatus']").eq(0).should('have.text', 'Prov Status');
+    cy.getElementByDataTestsId('node-f8360508-3f17-4414-a2ed-6bc71161e8db-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0').find("[data-tests-id='status-property-orchStatus']").eq(0).should('have.text', 'Active');
+    cy.getElementByDataTestsId('node-f8360508-3f17-4414-a2ed-6bc71161e8db-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0').find("[data-tests-id='status-property-inMaint']").eq(0).should('have.text', '');
+
+    cy.getElementByDataTestsId("serviceInstance").should('have.text', 'Service instance:');
+    cy.getElementByDataTestsId("serviceName").should('have.text', 'mCaNkinstancename');
+    cy.getElementByDataTestsId("orchStatusLabel").should('have.text', 'Orch Status:');
+    cy.getElementByDataTestsId("orchStatusValue").should('have.text', 'Active');
+    cy.getElementByDataTestsId("quantityLabel").should('be.visible');
+    cy.getElementByDataTestsId("servicesQuantity").should('have.text', ' 1 ');
+
+
+  });
+
+  it(`when open service planning in view mode service instance is shown as expected - e2e with API's ServiceTreeWithMultipleChildren`, function () {
+    const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+    const SERVICE_TYPE: string = "TYLER SILVIA";
+    const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+    const SERVICE_MODEL_ID: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44';
+
+    cy.readFile('../vid-automation/src/test/resources/aaiGetInstanceTopology/ServiceTreeWithMultipleChildren_serviceModel.json').then((res) => {
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/rest/models/services/6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+        200,
+        0,
+        "ServiceTreeWithMultipleChildren_serviceModel",
+      )
+    });
+
+    cy.readFile('../vid-automation/src/test/resources/aaiGetInstanceTopology/ServiceTreeWithMultipleChildren_serviceInstance.json').then((res) => {
+      jsonBuilderAndMock.basicJson(
+        res,
+        Cypress.config('baseUrl') + "/aai_get_service_instance_topology/e433710f-9217-458d-a79d-1c7aff376d89/TYLER SILVIA/f8791436-8d55-4fde-b4d5-72dd2cf13cfb",
+        200, 0,
+        "ServiceTreeWithMultipleChildren_serviceInstance",
+      )
+    });
+
+    cy.openIframe(`app/ui/#/servicePlanning/VIEW?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}`);
+
+    /*
+    0. title area -> generic stuff
+                     instance name
+                     orch status
+                     service name
+    */
+    cy.getElementByDataTestsId("serviceInstance").should('have.text', 'Service instance:');
+    cy.getElementByDataTestsId("orchStatusLabel").should('have.text', 'Orch Status:');
+    cy.getElementByDataTestsId("quantityLabel").should('be.visible');
+    cy.getElementByDataTestsId("servicesQuantity").should('have.text', ' 1 ');
+
+    // specific
+    cy.getElementByDataTestsId("serviceName").should('have.text', 'SERVICE_INSTANCE_NAME');
+    cy.getElementByDataTestsId("orchStatusValue").should('have.text', 'GARBAGE DATA');
+    cy.get('span#service-model-name').should('have.text', 'ComplexService');
+
+    // test component info of service-level
+    let labelsAndValues = [
+      ['Model Version', '1.0'],
+      ['Instance ID', 'service-instance-id'],
+      ['Service Type', 'service-instance-type'],
+    ];
+    cy.assertComponentInfoTitleLabelsAndValues('Service Instance INFO', labelsAndValues);
+
+
+    // expand all
+    cy.get('available-models-tree').find('.toggle-children').click({ multiple: true });
+
+    /*
+    1. Left tree -> VNF with 3 vf modules
+                    Network
+                    Configuration
+    */
+    const leftShouldHaves: { [dataTestId: string]: { [dataTestId: string]: string; }; } = {
+      'node-VF_vMee 0': {
+        'node-type-indicator': 'VNF',
+        'node-name': 'VF_vMee 0',
+        'numberButton': '1',
+      },
+      'node-vf_vmee0..VfVmee..base_vmme..module-0': {
+        'node-type-indicator': 'M',
+        'node-name': 'vf_vmee0..VfVmee..base_vmme..module-0',
+        'numberButton': '',
+      },
+      'node-vf_vmee0..VfVmee..vmme_vlc..module-1': {
+        'node-type-indicator': 'M',
+        'node-name': 'vf_vmee0..VfVmee..vmme_vlc..module-1',
+        'numberButton': '1',
+      },
+      'node-vf_vmee0..VfVmee..vmme_gpb..module-2': {
+        'node-type-indicator': 'M',
+        'node-name': 'vf_vmee0..VfVmee..vmme_gpb..module-2',
+        'numberButton': '',
+      },
+      'node-ExtVL 0': {
+        'node-type-indicator': 'N',
+        'node-name': 'ExtVL 0',
+        'numberButton': '2',
+      },
+      'node-Port Mirroring Configuration By Policy 0': {
+        'node-type-indicator': 'C',
+        'node-name': 'Port Mirroring Configuration By Policy 0',
+        'numberButton': '',
+      },
+    };
+
+    for (let node in leftShouldHaves) {
+      for (let span in leftShouldHaves[node]) {
+        const expected = leftShouldHaves[node][span];
+        cy.getElementByDataTestsId(node).find(`[data-tests-id='${span}']`).should(expected ? 'have.text' : 'not.exist', expected);
+      }
+    }
+
+    /*
+    2. Right tree -> VNF with 2 vf modules
+                     2 networks
+                     IGNORE, don't check: first node, which have no Service connection
+    */
+    const rightShouldHaves: { [dataTestId: string]: { [dataTestId: string]: string; }; } = {
+      'node-d6557200-ecf2-4641-8094-5393ae3aae60-VF_vMee 0:0': {
+        'node-type-indicator': 'VNF',
+        'node-name': 'VNF2_INSTANCE_NAME',
+        'status-property-orchStatus': '',
+        'status-property-provStatus': '',
+        'status-property-inMaint': '',
+      },
+      'node-undefined-dc229cd8-c132-4455-8517-5c1787c18b14:0': {
+        'node-type-indicator': 'M',
+        'node-name': 'ss820f_0918_base',
+        'status-property-orchStatus': 'Assigned',
+        'status-property-provStatus': '',
+      },
+      'node-522159d5-d6e0-4c2a-aa44-5a542a12a830-vf_vmee0..VfVmee..vmme_vlc..module-1:0': {
+        'node-type-indicator': 'M',
+        'node-name': 'ss820f_0918_db',
+        'status-property-orchStatus': 'deleted',
+        'status-property-provStatus': '',
+        'status-property-inMaint': '',
+      },
+      'node-ddc3f20c-08b5-40fd-af72-c6d14636b986-ExtVL 0:0': {
+        'node-type-indicator': 'N',
+        'node-name': 'NETWORK3_INSTANCE_NAME',
+        'status-property-orchStatus': 'Assigned',
+        'status-property-provStatus': 'nvtprov',
+      },
+      'node-ddc3f20c-08b5-40fd-af72-c6d14636b986-ExtVL 0:1': {
+        'node-type-indicator': 'N',
+        'node-name': 'NETWORK4_INSTANCE_NAME',
+        'status-property-orchStatus': 'Created',
+        'status-property-provStatus': 'preprov',
+      },
+    };
+
+    for (let node in rightShouldHaves) {
+      var [nodeName, nodeEq] = node.split(":");
+      for (let span in rightShouldHaves[node]) {
+        cy.getElementByDataTestsId(nodeName).eq(+nodeEq).find(`[data-tests-id='${span}']`).should('have.text', rightShouldHaves[node][span]);
+      }
+    }
+
+    /*
+    3. Left to right connections ->
+                    vnf: # of instances = 1, click -> vnf selected
+                    vf module1: # of instances = 1, click -> 1 vfmodule "ss820f_0918_db" selected
+                    vf module2: # of instances = 0, click -> nothing
+                    vf module3: # of instances = 0, click -> nothing
+                    network: # of instances = 2, click -> 2 networks selected
+                    configuration: # of instances = 0, click -> nothing
+    */
+    const leftShouldHighlight: { [text: string]: string[] } = {
+      'VF_vMee 0': ['VNF2_INSTANCE_NAME'],
+      'vf_vmee0..VfVmee..base_vmme..module-0': [],
+      'vf_vmee0..VfVmee..vmme_vlc..module-1': ['ss820f_0918_db'],
+      'vf_vmee0..VfVmee..vmme_gpb..module-2': [],
+      'ExtVL 0': ['NETWORK3_INSTANCE_NAME', 'NETWORK4_INSTANCE_NAME'],
+      'Port Mirroring Configuration By Policy 0': [],
+    };
+
+    for (let text in leftShouldHighlight) {
+      cy.get('available-models-tree').contains(text).click();
+
+      cy.get('.node-content-wrapper-active').find(`[data-tests-id='node-name']`).should('have.text', text + leftShouldHighlight[text].join(''));
+    }
+
+    /*
+    4. Right to left connections ->
+                    vnf: click -> vnf selected
+                    vf module1: click -> nothing
+                    vf module2: click -> vemme0 selected
+                    network1: click -> network selected
+                    network2: click -> network selected
+     */
+    const rightShouldHighlight: { [text: string]: string[] } = {
+      'VNF2_INSTANCE_NAME': ['VF_vMee 0'],
+      'ss820f_0918_base': [],
+      'ss820f_0918_db': ['vf_vmee0..VfVmee..vmme_vlc..module-1'],
+      'NETWORK3_INSTANCE_NAME': ['ExtVL 0'],
+      'NETWORK4_INSTANCE_NAME': ['ExtVL 0'],
+    };
+
+    for (let node in rightShouldHighlight) {
+      cy.get('drawing-board-tree').contains(node).click();
+      cy.get('.node-content-wrapper-active').find(`[data-tests-id='node-name']`).should('have.text', rightShouldHighlight[node].join('') + node);
+    }
+    cy.getElementByDataTestsId('isViewOnly-status-test').contains('VIEW ONLY');
+
+
+    /*
+      5. Click outside should remove highlight from all trees.
+     */
+
+    cy.clickOutside('search-left-tree-input', ()=>{
+      cy.get('.node-content-wrapper-active.node-content-wrapper-focused').should('have.length', 2)
+    },  ()=>{
+      cy.get('.node-content-wrapper-active.node-content-wrapper-focused').should('have.length', 0);
+    });
+
+
+  });
+});
diff --git a/vid-webpack-master/cypress/integration/iFrames/vnf.popup.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/vnf.popup.e2e.ts
new file mode 100644 (file)
index 0000000..98a118e
--- /dev/null
@@ -0,0 +1,1856 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+
+describe('Vnf popup', function () {
+  describe('basic UI tests', () => {
+
+    beforeEach(() => {
+      cy.window().then((win) => {
+        win.sessionStorage.clear();
+        cy.setReduxState();
+        cy.preventErrorsOnLoading();
+        cy.initAAIMock();
+        cy.initVidMock();
+        cy.login();
+      })
+    });
+
+    afterEach(() => {
+      cy.screenshot();
+    });
+
+    it('volume group should change on instance name blur if the value is null or empty', function () {
+        let redux = getReduxWithVNFS();
+        redux.service.serviceHierarchy['6e59c5de-f052-46fa-aa7e-2fca9d674c44'].vnfs['VF_vMee 0'].properties['ecomp_generated_naming'] = 'false';
+        redux.service.serviceHierarchy['6e59c5de-f052-46fa-aa7e-2fca9d674c44'].vfModules['vf_vmee0..VfVmee..vmme_vlc..module-1']['volumeGroupAllowed'] = true;
+
+        cy.setReduxState(<any>redux);
+        cy.openIframe('app/ui/#/servicePlanning?serviceModelId=6e59c5de-f052-46fa-aa7e-2fca9d674c44');
+
+        cy.getElementByDataTestsId('node-522159d5-d6e0-4c2a-aa44-5a542a12a830-vf_vmee0..VfVmee..vmme_vlc..module-1-menu-btn').click({force: true})
+          .getElementByDataTestsId('context-menu-edit').click({force: true})
+          .getElementByDataTestsId('form-set').should('not.have.attr', 'disabled')
+          .getElementByDataTestsId("instanceName").clear()
+          .getElementByDataTestsId('form-set').should('have.attr', 'disabled')
+          .typeToInput('instanceName', 'someInput1');
+        cy.getElementByDataTestsId('instanceName').blur();
+        cy.getElementByDataTestsId("volumeGroupName").should('have.value', 'someInput1_vol');
+        cy.getElementByDataTestsId('form-set').should('not.have.attr', 'disabled');
+        cy.typeToInput('volumeGroupName', 'textAfter');
+        cy.getElementByDataTestsId('form-set').click()
+          .get('#drawing-board-tree .toggle-children').click()
+          .getElementByDataTestsId('node-522159d5-d6e0-4c2a-aa44-5a542a12a830-vf_vmee0..VfVmee..vmme_vlc..module-1-menu-btn').click({force: true})
+          .getElementByDataTestsId('context-menu-edit').click({force: true})
+          .getElementByDataTestsId("volumeGroupName").should('have.value', 'someInput1_voltextAfter');
+
+    });
+
+    it('should display min/max', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res) => {
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].vnfs['2017-488_ADIOD-vPE 0'].properties.min_instances = 100;
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].vnfs['2017-488_ADIOD-vPE 0'].properties.max_instances = 200;
+        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.getElementByDataTestsId('model-item-label-vnf-min').contains('Minimum to instantiate');
+        cy.getElementByDataTestsId('model-item-value-vnf-min').contains('100');
+        cy.getElementByDataTestsId('model-item-label-vnf-max').contains('Maximum to instantiate');
+        cy.getElementByDataTestsId('model-item-value-vnf-max').contains('200');
+      })
+    });
+
+    it('should display default values for undefined min/max', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res) => {
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].vnfs['2017-488_ADIOD-vPE 0'].properties.min_instances = null;
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].vnfs['2017-488_ADIOD-vPE 0'].properties.max_instances = null;
+        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.getElementByDataTestsId('model-item-label-vnf-min').contains('Minimum to instantiate');
+        cy.getElementByDataTestsId('model-item-value-vnf-min').contains('0');
+        cy.getElementByDataTestsId('model-item-label-vnf-max').contains('Maximum to instantiate');
+        cy.getElementByDataTestsId('model-item-value-vnf-max').contains('1');
+      })
+     });
+
+    it('fill all fields of vnf popup', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res) => {
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].vnfs['2017-488_ADIOD-vPE 0'].min = null;
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].vnfs['2017-488_ADIOD-vPE 0'].max = null;
+        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', 'Emanuel');
+        cy.selectDropdownOptionByText('lcpRegion', 'hvf6');
+        cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-STTest2');
+        cy.selectDropdownOptionByText('lineOfBusiness', 'zzz1');
+        cy.selectDropdownOptionByText('platform', 'xxx1');
+
+      })
+    });
+
+    function getReduxWithVNFS(){
+      return {
+        "global": {
+          "name": null,
+          "flags": {
+            "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+            "FLAG_SHOW_ASSIGNMENTS": true,
+            "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+            "FLAG_UNASSIGN_SERVICE": true,
+            "FLAG_SHOW_VERIFY_SERVICE": false,
+            "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+            "FLAG_DUPLICATE_VNF": true,
+            "FLAG_SERVICE_MODEL_CACHE": true,
+            "CREATE_INSTANCE_TEST": false,
+            "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+            "FLAG_ASYNC_INSTANTIATION": true,
+            "FLAG_ASYNC_JOBS": true,
+            "EMPTY_DRAWING_BOARD_TEST": false,
+            "FLAG_ADD_MSO_TESTAPI_FIELD": true
+          },
+          "type": "[FLAGS] Update"
+        },
+        "service": {
+          "serviceHierarchy": {
+            "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": "Emanuel",
+                "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": {
+                    "max_instances" : 10,
+                    "min_instances"  : 1,
+                    "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                    "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                    "Internal2_net_cidr": "10.0.0.10",
+                    "sctp-a-ingress-dst_start_port": "0.0",
+                    "sctp-a-egress-dst_start_port": "0.0",
+                    "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                    "sctp-b-ipv6-egress_ethertype": "IPv4",
+                    "Internal1_net_cidr": "10.0.0.10",
+                    "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:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                    "Internal1_net_cidr_len": "17",
+                    "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "vlc_st_interface_type_oam": "management",
+                    "multi_stage_design": "false",
+                    "oam_sec_group_name": "oam-sec-group",
+                    "Internal2_net_gateway": "10.0.0.10",
+                    "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                    "sctp-b-ipv6-egress-dst_start_port": "0",
+                    "Internal1_net_gateway": "10.0.0.10",
+                    "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:11:22:EF:AC:DF",
+                    "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:11:22:EF:AC:DF",
+                    "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": {}
+            }
+          },
+          "serviceInstance": {
+            "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+              "vnfs": {
+                "VF_vMee 0": {
+                  "originalName": "VF_vMee 0",
+                  "rollbackOnFailure": "true",
+                  "vfModules": {
+                    "vf_vmee0..VfVmee..vmme_vlc..module-1": {
+                      "vf_vmee0..VfVmee..vmme_vlc..module-1dcudx": {
+                        "modelInfo": {
+                          "modelInvariantId": "98a7c88b-b577-476a-90e4-e25a5871e02b",
+                          "modelVersionId": "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+                          "modelName": "VfVmee..vmme_vlc..module-1",
+                          "modelVersion": "2",
+                          "modelCustomizationId": "55b1be94-671a-403e-a26c-667e9c47d091",
+                          "modelCustomizationName": "VfVmee..vmme_vlc..module-1"
+                        },
+                        "isMissingData": false,
+                        "instanceParams": [
+                          {}
+                        ]
+                      }
+                    }
+                  },
+                  "isMissingData": false,
+                  "modelName": "VF_vMee 0",
+                  "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+                  "lcpCloudRegionId": "hvf6",
+                  "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+                  "lineOfBusiness": "zzz1",
+                  "platformName": "platform",
+                  "modelInfo": {
+                    "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+                    "modelVersionId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+                    "modelName": "VF_vMee",
+                    "modelVersion": "2.0",
+                    "modelCustomizationId": "91415b44-753d-494c-926a-456a9172bbb9",
+                    "modelCustomizationName": "VF_vMee 0"
+                  }
+                }
+              },
+              "instanceParams": [
+                {}
+              ],
+              "validationCounter": 0,
+              "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+              "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+              "subscriptionServiceType": "TYLER SILVIA",
+              "lcpCloudRegionId": "hvf6",
+              "tenantId": "1178612d2b394be4834ad77f567c0af2",
+              "aicZoneId": "YYY1",
+              "projectName": "yyy1",
+              "owningEntityId": "aaa1",
+              "rollbackOnFailure": "true",
+              "bulkSize": 1,
+              "modelInfo": {
+                "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+                "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+                "modelName": "ComplexService",
+                "modelVersion": "1.0"
+              },
+              "existingVNFCounterMap": {
+                "91415b44-753d-494c-926a-456a9172bbb9": 1
+              },
+              "existingNames": {},
+              "existingNetworksCounterMap" : {},
+              "tenantName": "AIN Web Tool-15-D-SSPtestcustome",
+              "aicZoneName": "UUUAIAAI-YYY1"
+            }
+          },
+          "lcpRegionsAndTenants": {
+            "lcpRegionList": [
+              {
+                "id": "JANET25",
+                "name": "JANET25 (AIC)",
+                "cloudOwner" : "irma-aic",
+                "isPermitted": true
+              },
+              {
+                "id": "hvf6",
+                "name": "hvf6 (AIC)",
+                "cloudOwner" : "irma-aic",
+                "isPermitted": true
+              }
+            ],
+            "lcpRegionsTenantsMap": {
+              "JANET25": [
+                {
+                  "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                  "name": "USP-SIP-IC-24335-T-01",
+                  "isPermitted": true
+                }
+              ],
+              "hvf6": [
+                {
+                  "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                  "name": "AIN Web Tool-15-D-testalexandria",
+                  "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-hvf6-09",
+                  "isPermitted": true
+                },
+                {
+                  "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                  "name": "DN5242-Nov16-T3",
+                  "isPermitted": true
+                }
+              ]
+            }
+          },
+          "subscribers": [
+            {
+              "id": "CAR_2020_ER",
+              "name": "CAR_2020_ER",
+              "isPermitted": true
+            },
+            {
+              "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+              "name": "JULIO ERICKSON",
+              "isPermitted": false
+            },
+            {
+              "id": "DHV1707-TestSubscriber-2",
+              "name": "DALE BRIDGES",
+              "isPermitted": false
+            },
+            {
+              "id": "DHV1707-TestSubscriber-1",
+              "name": "LLOYD BRIDGES",
+              "isPermitted": false
+            },
+            {
+              "id": "jimmy-example",
+              "name": "JimmyExampleCust-20161102",
+              "isPermitted": false
+            },
+            {
+              "id": "jimmy-example2",
+              "name": "JimmyExampleCust-20161103",
+              "isPermitted": false
+            },
+            {
+              "id": "ERICA5779-TestSub-PWT-102",
+              "name": "ERICA5779-TestSub-PWT-102",
+              "isPermitted": false
+            },
+            {
+              "id": "ERICA5779-TestSub-PWT-101",
+              "name": "ERICA5779-TestSub-PWT-101",
+              "isPermitted": false
+            },
+            {
+              "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "ERICA5779-Subscriber-4",
+              "name": "ERICA5779-Subscriber-5",
+              "isPermitted": false
+            },
+            {
+              "id": "ERICA5779-TestSub-PWT-103",
+              "name": "ERICA5779-TestSub-PWT-103",
+              "isPermitted": false
+            },
+            {
+              "id": "ERICA5779-Subscriber-2",
+              "name": "ERICA5779-Subscriber-2",
+              "isPermitted": false
+            },
+            {
+              "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+              "name": "SILVIA ROBBINS",
+              "isPermitted": true
+            },
+            {
+              "id": "ERICA5779-Subscriber-3",
+              "name": "ERICA5779-Subscriber-3",
+              "isPermitted": false
+            },
+            {
+              "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+              "name": "CRAIG/ROBERTS",
+              "isPermitted": false
+            }
+          ],
+          "productFamilies": [
+            {
+              "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+              "name": "SCOTTIE",
+              "isPermitted": true
+            },
+            {
+              "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+              "name": "IGNACIO",
+              "isPermitted": true
+            },
+            {
+              "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+              "name": "Christie",
+              "isPermitted": true
+            },
+            {
+              "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+              "name": "Enhanced Services",
+              "isPermitted": true
+            },
+            {
+              "id": "vTerrance",
+              "name": "vTerrance",
+              "isPermitted": true
+            },
+            {
+              "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+              "name": "vSCP",
+              "isPermitted": true
+            },
+            {
+              "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+              "name": "Emanuel",
+              "isPermitted": true
+            },
+            {
+              "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+              "name": "BVOIP",
+              "isPermitted": true
+            },
+            {
+              "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+              "name": "LINDSEY",
+              "isPermitted": true
+            },
+            {
+              "id": "LRSI-OSPF",
+              "name": "LRSI-OSPF",
+              "isPermitted": true
+            },
+            {
+              "id": "vRosemarie",
+              "name": "HNGATEWAY",
+              "isPermitted": true
+            },
+            {
+              "id": "vHNPaas",
+              "name": "WILKINS",
+              "isPermitted": true
+            },
+            {
+              "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+              "name": "VROUTER",
+              "isPermitted": true
+            },
+            {
+              "id": "Cisneros",
+              "name": "vMuriel",
+              "isPermitted": true
+            },
+            {
+              "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+              "name": "CARA Griffin",
+              "isPermitted": true
+            },
+            {
+              "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+              "name": "DARREN MCGEE",
+              "isPermitted": true
+            },
+            {
+              "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+              "name": "Transport",
+              "isPermitted": true
+            },
+            {
+              "id": "vSalvatore",
+              "name": "vSalvatore",
+              "isPermitted": true
+            },
+            {
+              "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+              "name": "Josefina",
+              "isPermitted": true
+            },
+            {
+              "id": "vHubbard",
+              "name": "vHubbard",
+              "isPermitted": true
+            },
+            {
+              "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+              "name": "DARREN MCGEE",
+              "isPermitted": true
+            }
+          ],
+          "serviceTypes": {
+            "e433710f-9217-458d-a79d-1c7aff376d89": [
+              {
+                "id": "0",
+                "name": "vRichardson",
+                "isPermitted": false
+              },
+              {
+                "id": "1",
+                "name": "TYLER SILVIA",
+                "isPermitted": true
+              },
+              {
+                "id": "2",
+                "name": "Emanuel",
+                "isPermitted": false
+              },
+              {
+                "id": "3",
+                "name": "vJamie",
+                "isPermitted": false
+              },
+              {
+                "id": "4",
+                "name": "vVoiceMail",
+                "isPermitted": false
+              },
+              {
+                "id": "5",
+                "name": "Kennedy",
+                "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": "LINDSEY",
+                "isPermitted": false
+              },
+              {
+                "id": "17",
+                "name": "JOHANNA_SANTOS",
+                "isPermitted": false
+              },
+              {
+                "id": "18",
+                "name": "vCarroll",
+                "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": "WayneHolland"
+              },
+              {
+                "id": "Melissa",
+                "name": "Melissa"
+              }
+            ],
+            "projectList": [
+              {
+                "id": "WATKINS",
+                "name": "WATKINS"
+              },
+              {
+                "id": "x1",
+                "name": "x1"
+              },
+              {
+                "id": "yyy1",
+                "name": "yyy1"
+              }
+            ],
+            "lineOfBusinessList": [
+              {
+                "id": "ONAP",
+                "name": "ONAP"
+              },
+              {
+                "id": "zzz1",
+                "name": "zzz1"
+              }
+            ],
+            "platformList": [
+              {
+                "id": "platform",
+                "name": "platform"
+              },
+              {
+                "id": "xxx1",
+                "name": "xxx1"
+              }
+            ]
+          },
+          "type": "[PRODUCT_FAMILIES] Update"
+        }
+      }
+    }
+
+  });
+});
diff --git a/vid-webpack-master/cypress/integration/iFrames/vnfGroups.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/vnfGroups.e2e.ts
new file mode 100644 (file)
index 0000000..5db0c75
--- /dev/null
@@ -0,0 +1,890 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+import {ServiceModel} from '../../support/jsonBuilders/models/service.model';
+import {JsonBuilder} from '../../support/jsonBuilders/jsonBuilder';
+
+describe('Vnf Groups', function () {
+  var jsonBuilderAndMock: JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+
+  beforeEach(() => {
+    cy.window().then((win) => {
+      win.sessionStorage.clear();
+      cy.setReduxState();
+      cy.preventErrorsOnLoading();
+      cy.initAAIMock();
+      cy.initVidMock();
+      cy.permissionVidMock();
+      cy.setTestApiParamToVNF();
+      cy.login();
+    });
+  });
+
+  afterEach(() => {
+    cy.screenshot();
+  });
+
+  describe('Vnf Group model basic view', function () {
+
+      it('Vnf group open new view edit', function () {
+        const instanceName: string = 'ABC';
+        const groupName = 'groupingservicefortest..ResourceInstanceGroup..0';
+        const nodeId = 'daeb6568-cef8-417f-9075-ed259ce59f48';
+        const serviceId = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + "/rest/models/services/" + serviceId,
+            200,
+            0,
+            "ServiceWithVnfGroup",
+          );
+
+          cy.buildReduxStateWithServiceRespone(res, serviceId, false);
+          cy.openIframe('app/ui/#/servicePlanning?serviceModelId=' + serviceId);
+          cy.getElementByDataTestsId('node-' + groupName).find(`[data-tests-id='node-type-indicator']`).contains('G');
+          cy.getElementByDataTestsId('node-' + groupName).contains('' + groupName);
+          cy.getElementByDataTestsId('node-' + groupName + '-add-btn').get('i').should('have.class', 'fa-plus-circle');
+          cy.getElementByDataTestsId('node-' + groupName + '-add-btn').click({force: true});
+          cy.getElementByDataTestsId('instanceName').clear();
+          cy.typeToInput('instanceName', instanceName);
+          cy.getElementByDataTestsId('form-set').click({force: true}).then(() => {
+            cy.getElementByDataTestsId('numberButton').contains('1');
+            cy.getElementByDataTestsId('node-' + nodeId + '-' + groupName).contains(instanceName);
+            cy.getElementByDataTestsId('node-' + nodeId + '-' + groupName + '-menu-btn')
+              .click({force: true});
+            cy.getElementByDataTestsId('context-menu-edit').click();
+            cy.getElementByDataTestsId('instanceName').clear();
+            cy.typeToInput('instanceName', instanceName + instanceName);
+            cy.getElementByDataTestsId('form-set').click({force: true}).then(() => {
+              cy.getElementByDataTestsId('node-' + nodeId + '-' + groupName + '-menu-btn').click({force: true})
+                .getElementByDataTestsId('context-menu-remove').click();
+            });
+          });
+        });
+      });
+
+      it('Create new service with vnf group', () => {
+
+        const SERVICE_MODEL_ID: string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+        const GROUP_NAME_TO_DEPLOY = 'groupingservicefortest..ResourceInstanceGroup..1';
+        const NODE_ID = 'c2b300e6-45de-4e5e-abda-3032bee2de56';
+        let serviceModel: JSON;
+        let basicServiceInstance: JSON;
+
+        cy.server().route({
+          url: Cypress.config('baseUrl') + '/asyncInstantiation/bulk',
+          method: 'POST',
+          status: 200,
+          response: "[]",
+        }).as("expectedPostAsyncInstantiation");
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          serviceModel = res;
+        });
+
+        cy.readFile('./cypress/support/jsonBuilders/mocks/jsons/vnfGroupBasicServiceInstance.json').then((res) => {
+          basicServiceInstance = res;
+        });
+
+        cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((reduxRes) => {
+
+          reduxRes.service.serviceHierarchy[SERVICE_MODEL_ID] = serviceModel;
+          reduxRes.service.serviceInstance[SERVICE_MODEL_ID] = basicServiceInstance;
+
+          cy.setReduxState(<any>reduxRes);
+
+          cy.openIframe('app/ui/#/servicePlanning?serviceModelId=' + SERVICE_MODEL_ID);
+          cy.getElementByDataTestsId('node-' + GROUP_NAME_TO_DEPLOY).find(`[data-tests-id='node-type-indicator']`).contains('G');
+          cy.getElementByDataTestsId('node-' + GROUP_NAME_TO_DEPLOY).contains('' + GROUP_NAME_TO_DEPLOY);
+          cy.getElementByDataTestsId('node-' + GROUP_NAME_TO_DEPLOY + '-add-btn').get('i').should('have.class', 'fa-plus-circle');
+          cy.getElementByDataTestsId('node-' + GROUP_NAME_TO_DEPLOY + '-add-btn').click({force: true});
+          cy.getElementByDataTestsId('node-' + NODE_ID + '-' + GROUP_NAME_TO_DEPLOY + '-menu-btn')
+            .click({force: true});
+          cy.getElementByDataTestsId('context-menu-edit').click();
+          cy.getElementByDataTestsId('instanceName').clear();
+          cy.typeToInput('instanceName', "ABC");
+          cy.getElementByDataTestsId('form-set').click({force: true});
+          cy.getElementByDataTestsId('deployBtn').should('have.text', 'DEPLOY').click();
+          cy.getElementByDataTestsId('isViewOnly-status-test').contains('IN DESIGN');
+          cy.getReduxState().then((state) => {
+            const vnfGroup = state.service.serviceInstance[SERVICE_MODEL_ID].vnfGroups[GROUP_NAME_TO_DEPLOY];
+
+            cy.wait('@expectedPostAsyncInstantiation').then(xhr => {
+                cy.readFile('../vid-automation/src/test/resources/VnfGroup/serviceWithVnfGroupCreateRequest.json').then((expectedResult) => {
+                expectedResult.vnfGroups[GROUP_NAME_TO_DEPLOY].trackById = vnfGroup.trackById;
+                cy.deepCompare(xhr.request.body, expectedResult);
+              });
+            });
+          });
+
+        });
+
+      });
+
+      it('Delete vnf group with members', () => {
+        cy.initSearchVNFMemebers();
+        const SERVICE_MODEL_ID: string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+        let serviceModel: JSON;
+        let basicServiceInstance: JSON;
+
+        cy.server().route({
+          url: Cypress.config('baseUrl') + '/asyncInstantiation/bulk',
+          method: 'POST',
+          status: 200,
+          response: "[]",
+        }).as("expectedPostAsyncInstantiation");
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          serviceModel = res;
+        });
+
+        cy.readFile('./cypress/support/jsonBuilders/mocks/jsons/vnfGroupBasicServiceInstance.json').then((res) => {
+          basicServiceInstance = res;
+        });
+
+        cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((reduxRes) => {
+
+          reduxRes.service.serviceHierarchy[SERVICE_MODEL_ID] = serviceModel;
+          reduxRes.service.serviceInstance[SERVICE_MODEL_ID] = basicServiceInstance;
+
+          cy.setReduxState(<any>reduxRes);
+
+          cy.openIframe('app/ui/#/servicePlanning?serviceModelId=' + SERVICE_MODEL_ID);
+          cy.getElementByDataTestsId('node-groupingservicefortest..ResourceInstanceGroup..0-add-btn').click({force: true});
+          removeVnfGroup();
+          cy.getElementByDataTestsId('node-groupingservicefortest..ResourceInstanceGroup..0-add-btn').click({force: true});
+          cy.getElementByDataTestsId('node-daeb6568-cef8-417f-9075-ed259ce59f48-groupingservicefortest..ResourceInstanceGroup..0-menu-btn')
+            .click({force: true});
+          cy.getElementByDataTestsId('context-menu-addGroupMember').click({force: true}).then(() => {
+            cy.get('.allCheckboxAreSelected input').click({force: true});
+            cy.getElementByDataTestsId('setMembersBtn').click({force: true})
+          });
+          cy.getElementByDataTestsId('node-daeb6568-cef8-417f-9075-ed259ce59f48-groupingservicefortest..ResourceInstanceGroup..0').click({force: true});
+          removeVnfGroup();
+          cy.getElementByDataTestsId('button-remove-group').click({force: true});
+          cy.get('#model-actions').should('not.exist');
+
+        });
+
+      });
+
+      it('Vnf group edit mode delete empty service instance', () => {
+        const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+        const SERVICE_TYPE: string = "TYLER SILVIA";
+        const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+        const SERVICE_MODEL_ID: string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+        let expectedResult: JSON;
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/rest/models/services/${SERVICE_MODEL_ID}`,
+            200,
+            0,
+            "ServiceWithVnfGrouping_serviceModel",
+          );
+        });
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/serviceWithVnfGroping_serviceInstance.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/aai_get_service_instance_topology/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INSTANCE_ID}`,
+            200, 0,
+            "serviceWithVnfGroping_serviceInstance",
+          )
+        });
+
+        cy.server().route({
+          url: Cypress.config('baseUrl') + '/asyncInstantiation/bulk',
+          method: 'POST',
+          status: 200,
+          response: "[]",
+        }).as("expectedPostAsyncInstantiation");
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/ServiceWithVnfGroupsDeleteRequest.json').then((res) => {
+          expectedResult = res;
+        });
+
+        cy.openIframe(`app/ui/#/servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}`);
+        cy.getElementByDataTestsId('openMenuBtn').click();
+        cy.getElementByDataTestsId('context-menu-header-delete-item').should('have.text', 'Delete');
+        cy.getElementByDataTestsId('context-menu-header-delete-item').click();
+        cy.getElementByDataTestsId('serviceName').should('have.css', 'text-decoration');
+        cy.getElementByDataTestsId('openMenuBtn').click();
+        cy.getElementByDataTestsId('context-menu-header-delete-item').should('have.text', 'Undo delete');
+        cy.getElementByDataTestsId('deployBtn').should('have.text', 'UPDATE').click();
+
+        cy.wait('@expectedPostAsyncInstantiation').then(xhr => {
+          cy.deepCompare(xhr.request.body, expectedResult);
+
+        });
+      });
+
+      it('Delete service with two vnf groups', () => {
+        const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+        const SERVICE_TYPE: string = "TYLER SILVIA";
+        const SERVICE_MODEL_ID: string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+        const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+        let expectedResult: JSON;
+
+        cy.server().route({
+          url: Cypress.config('baseUrl') + '/asyncInstantiation/bulk',
+          method: 'POST',
+          status: 200,
+          response: "[]",
+        }).as("expectedPostAsyncInstantiation");
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/serviceWithVnfGroupsChildren_serviceInstance.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/aai_get_service_instance_topology/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INSTANCE_ID}`,
+            200, 0,
+            "serviceWithVnfGroupsChildren_serviceInstance",
+          )
+        });
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/rest/models/services/${SERVICE_MODEL_ID}`,
+            200,
+            0,
+            "ServiceTreeWithMultipleChildren_serviceModel",
+          )
+        });
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/deleteServiceWith2VnfGroupsRequest_AndThreeGroupMembers.json').then((expectedResult) => {
+          cy.openIframe(`app/ui/#/servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}`);
+          cy.getElementByDataTestsId('openMenuBtn').click();
+          cy.getElementByDataTestsId('context-menu-header-delete-item').should('have.text', 'Delete').click();
+          cy.getElementByDataTestsId('deployBtn').should('have.text', 'UPDATE').click();
+          cy.wait('@expectedPostAsyncInstantiation').then(xhr => {
+            cy.deepCompare(xhr.request.body, expectedResult);
+          });
+        });
+      });
+
+      it(`when open service with group in EDIT mode, service instance is shown as expected - e2e with input and output API's tests"`, function () {
+        const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+        const SERVICE_TYPE: string = "TYLER SILVIA";
+        const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+        const SERVICE_MODEL_ID: string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+
+        cy.server().route({
+          url: Cypress.config('baseUrl') + '/asyncInstantiation/bulk',
+          method: 'POST',
+          status: 200,
+          response: "[]",
+        }).as("expectedPostAsyncInstantiation");
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/rest/models/services/${SERVICE_MODEL_ID}`,
+            200,
+            0,
+            "ServiceTreeWithMultipleChildren_serviceModel",
+          )
+        });
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/serviceWithVnfGroupsChildren_serviceInstance.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/aai_get_service_instance_topology/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INSTANCE_ID}`,
+            200, 0,
+            "serviceWithVnfGroupsChildren_serviceInstance",
+          )
+        });
+
+        cy.openIframe(`app/ui/#/servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}`);
+
+        /*
+        0. title area -> generic stuff
+                         instance name
+                         orch status
+                         service name
+        */
+        cy.getElementByDataTestsId("serviceInstance").should('have.text', 'Service instance:');
+        cy.getElementByDataTestsId("orchStatusLabel").should('have.text', 'Orch Status:');
+        // ERROR! cy.getElementByDataTestsId("quantityLabel").should('not.be.visible');
+        // ERROR! cy.getElementByDataTestsId("servicesQuantity").should('not.be.visible');
+
+        // specific
+        cy.getElementByDataTestsId("serviceName").should('have.text', 'SERVICE_INSTANCE_NAME');
+        cy.getElementByDataTestsId("orchStatusValue").should('have.text', 'GARBAGE DATA');
+        cy.get('span#service-model-name').contains('Grouping Service for Test');
+
+        // no need to expand anything
+        cy.get('available-models-tree').find('.toggle-children').should('not.exist');
+
+        /*
+        1. Left tree
+        */
+        const leftShouldHaves: { [dataTestId: string]: { [dataTestId: string]: string; }; } = {
+          'node-groupingservicefortest..ResourceInstanceGroup..0': {
+            'node-type-indicator': 'G',
+            'node-name': 'groupingservicefortest..ResourceInstanceGroup..0',
+            'numberButton': '2',
+          },
+          'node-groupingservicefortest..ResourceInstanceGroup..1': {
+            'node-type-indicator': 'G',
+            'node-name': 'groupingservicefortest..ResourceInstanceGroup..1',
+            'numberButton': '',
+          },
+        };
+        cy.getElementByDataTestsId('search-left-tree-input').type('group');
+        for (let node in leftShouldHaves) {
+          cy.getElementByDataTestsId(node).find(`[data-tests-id= '${'node-name'}']`).find('.highlight').eq(0).should('have.text', 'group');
+
+          for (let span in leftShouldHaves[node]) {
+            const expected = leftShouldHaves[node][span];
+            cy.getElementByDataTestsId(node).find(`[data-tests-id='${span}']`).should(expected ? 'have.text' : 'not.exist', expected);
+          }
+        }
+
+
+        /*
+        2. Right tree
+        */
+        const rightShouldHaves: { [dataTestId: string]: { [dataTestId: string]: string; }; } = {
+          'node-daeb6568-cef8-417f-9075-ed259ce59f48-groupingservicefortest..ResourceInstanceGroup..0:0': {
+            'node-type-indicator': 'G',
+            'node-name': 'VNF_GROUP1_INSTANCE_NAME',
+            'status-property-orchStatus': '',
+            'status-property-provStatus': '',
+            // 'status-property-inMaint': '', not exists for false in maint
+          },
+          'node-daeb6568-cef8-417f-9075-ed259ce59f48-groupingservicefortest..ResourceInstanceGroup..0:1': {
+            'node-type-indicator': 'G',
+            'node-name': 'VNF_GROUP2_INSTANCE_NAME',
+            'status-property-orchStatus': '',
+            'status-property-provStatus': '',
+            // 'status-property-inMaint': 'false',
+          },
+        };
+        cy.getElementByDataTestsId('search-right-tree-input').type('vnf');
+
+        for (let node in rightShouldHaves) {
+          var [nodeName, nodeEq] = node.split(":");
+          for (let span in rightShouldHaves[node]) {
+            cy.getElementByDataTestsId(nodeName).eq(+nodeEq).find(`[data-tests-id='${span}']`).should('have.text', rightShouldHaves[node][span]);
+            cy.getElementByDataTestsId(nodeName).eq(+nodeEq).find(`[data-tests-id= '${'node-name'}']`).find('.highlight').eq(0).should('have.text', 'VNF');
+
+          }
+        }
+
+        /*
+        3. Left to right connections
+        */
+        const leftShouldHighlight: { [text: string]: string[] } = {
+          'groupingservicefortest..ResourceInstanceGroup..0': ['VNF_GROUP1_INSTANCE_NAME', 'VNF_GROUP2_INSTANCE_NAME'],
+          'groupingservicefortest..ResourceInstanceGroup..1': [],
+        };
+
+        for (let text in leftShouldHighlight) {
+          cy.get('available-models-tree').contains(text).click();
+          cy.get('.node-content-wrapper-active').find(`[data-tests-id='node-name']`).should('have.text', text + leftShouldHighlight[text].join(''));
+        }
+
+        /*
+        4. Right to left connections
+         */
+        const rightShouldHighlight: { [text: string]: string[] } = {
+          'VNF_GROUP1_INSTANCE_NAME': ['groupingservicefortest..ResourceInstanceGroup..0'],
+          'VNF_GROUP2_INSTANCE_NAME': ['groupingservicefortest..ResourceInstanceGroup..0'],
+        };
+
+        for (let node in rightShouldHighlight) {
+          cy.get('drawing-board-tree').contains(node).click();
+          cy.get('.node-content-wrapper-active').find(`[data-tests-id='node-name']`).should('have.text', rightShouldHighlight[node].join('') + node);
+        }
+
+        /*
+        Menus
+         */
+        // SETUP: delete one group on the right; add one group from the left
+        const myNode = 'node-daeb6568-cef8-417f-9075-ed259ce59f48-groupingservicefortest..ResourceInstanceGroup..0';
+
+        cy.getElementByDataTestsId(`${myNode}-menu-btn`).eq(0).click({force: true})
+          .getElementByDataTestsId('context-menu-delete').click();
+
+        cy.getElementByDataTestsId('node-groupingservicefortest..ResourceInstanceGroup..0-add-btn').click({force: true});
+        cy.getElementByDataTestsId(`${myNode}-menu-btn`).eq(2).click({force: true})
+          .getElementByDataTestsId('context-menu-edit').click();
+        cy.getElementByDataTestsId('instanceName').clear();
+        cy.typeToInput('instanceName', 'VNF_GROUP3_INSTANCE_NAME');
+        cy.getElementByDataTestsId('form-set').click({force: true});
+
+        // TEST:
+        // #2 is just added
+        // #1 is from AAI
+        // #0 is deleted
+        const menuShouldHave: { [text: string]: string[] } = {
+          [`${myNode}-menu-btn:2`]: ['remove', 'addGroupMember'],
+          [`${myNode}-menu-btn:1`]: ['showAuditInfo', 'addGroupMember', 'delete'],
+          [`${myNode}-menu-btn:0`]: ['showAuditInfo', 'undoDelete'],
+        };
+
+        for (let node in menuShouldHave) {
+          const [nodeName, nodeEq] = node.split(":");
+          let enabledActions:string[] = menuShouldHave[node];
+          cy.assertMenuItemsForNode(enabledActions, nodeName, +nodeEq);
+        }
+
+        const GROUP_NAME_TO_DEPLOY: string = 'groupingservicefortest..ResourceInstanceGroup..0';
+        cy.getElementByDataTestsId('deployBtn').should('have.text', 'UPDATE').click();
+
+        cy.getReduxState().then((state) => {
+          const addedVnfGroup = state.service.serviceInstance[SERVICE_MODEL_ID].vnfGroups[GROUP_NAME_TO_DEPLOY];
+
+          cy.wait('@expectedPostAsyncInstantiation').then(xhr => {
+            cy.readFile('../vid-automation/src/test/resources/VnfGroup/VnfGroupCreate1Delete1None1Request.json').then((expectedResult) => {
+              expectedResult.vnfGroups[GROUP_NAME_TO_DEPLOY].trackById = addedVnfGroup.trackById;
+              cy.deepCompare(xhr.request.body, expectedResult);
+            });
+          });
+        });
+      });
+
+      it(`vnf group with vnf members should display correctly and should have delete option"`, function () {
+        const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+        const SERVICE_TYPE: string = "TYLER SILVIA";
+        const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+        const SERVICE_MODEL_ID: string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/rest/models/services/${SERVICE_MODEL_ID}`,
+            200,
+            0,
+            "ServiceTreeWithMultipleChildren_serviceModel",
+          )
+        });
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/serviceWithVnfGroupsChildren_serviceInstance.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/aai_get_service_instance_topology/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INSTANCE_ID}`,
+            200, 0,
+            "serviceWithVnfGroupsChildren_serviceInstance",
+          )
+        });
+
+        cy.openIframe(`app/ui/#/servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}&mode=EDIT`);
+        cy.getElementByDataTestsId('deployBtn').should('have.attr', 'disabled');
+        cy.get('#VnfGroup_VNF .icon-browse').eq(0).click({force: true}).then(() => {
+          cy.getElementByDataTestsId('context-menu-delete').click({force: true});
+          cy.getElementByDataTestsId('deployBtn').should('not.have.attr', 'disabled');
+
+          cy.get('#VnfGroup_VNF .icon-browse').eq(0).click({force: true}).then(() => {
+            cy.getElementByDataTestsId('context-menu-undoDelete').click({force: true});
+            cy.getElementByDataTestsId('deployBtn').should('have.attr', 'disabled');
+          });
+        });
+
+
+        cy.getElementByDataTestsId('node-daeb6568-cef8-417f-9075-ed259ce59f48-groupingservicefortest..ResourceInstanceGroup..0-menu-btn')
+          .eq(0).click({force: true}).then(() => {
+          cy.getElementByDataTestsId('context-menu-delete').click({force: true});
+          cy.getElementByDataTestsId('deployBtn').should('not.have.attr', 'disabled');
+        })
+      });
+
+      it('Delete 2 from 3 VNF members and check request body of deploy', function () {
+        const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+        const SERVICE_TYPE: string = "TYLER SILVIA";
+        const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+        const SERVICE_MODEL_ID: string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+
+        cy.server().route({
+          url: Cypress.config('baseUrl') + '/asyncInstantiation/bulk',
+          method: 'POST',
+          status: 200,
+          response: "[]",
+        }).as("expectedPostAsyncInstantiation");
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/rest/models/services/${SERVICE_MODEL_ID}`,
+            200,
+            0,
+            "ServiceTreeWithMultipleChildren_serviceModel",
+          )
+        });
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/serviceWithVnfGroupsChildren_serviceInstance.json').then((res) => {
+
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/aai_get_service_instance_topology/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INSTANCE_ID}`,
+            200, 0,
+            "serviceWithVnfGroupsChildren_serviceInstance",
+          )
+        });
+
+        cy.openIframe(`app/ui/#/servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}&mode=EDIT`);
+        cy.getElementByDataTestsId('deployBtn').should('have.attr', 'disabled');
+
+        for (let index = 0; index < 2; index++) {
+          cy.get('#VnfGroup_VNF .icon-browse').eq(index).click({force: true}).then(() => {
+            cy.getElementByDataTestsId('context-menu-delete').click({force: true});
+            cy.getElementByDataTestsId('deployBtn').should('not.have.attr', 'disabled');
+          });
+        }
+
+        cy.getElementByDataTestsId('deployBtn').should('have.text', 'UPDATE').click();
+
+        cy.wait('@expectedPostAsyncInstantiation').then(xhr => {
+          cy.readFile('../vid-automation/src/test/resources/VnfGroup/payloadTemplate1VnfGroupWith3MembersRequest.json').then((expectedResult) => {
+            expectedResult.vnfGroups.VNF_GROUP1_INSTANCE_ID.action = 'None';
+            expectedResult.vnfGroups.VNF_GROUP1_INSTANCE_ID.vnfs.RELATED_VNF1_INSTANCE_ID.action = 'None_Delete';
+            expectedResult.vnfGroups.VNF_GROUP1_INSTANCE_ID.vnfs.RELATED_VNF2_INSTANCE_ID.action = 'None_Delete';
+            cy.deepCompare(xhr.request.body, expectedResult);
+          });
+        });
+      });
+
+      it(`vnf group with vnf members, add group members option open modal"`, () => {
+        const SUBSCRIBER_ID: string = "global-customer-id";
+        const SERVICE_TYPE: string = "service-instance-type";
+        const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+        const SERVICE_MODEL_ID: string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+        const SERVICE_INVARIANT_ID: string = '24632e6b-584b-4f45-80d4-fefd75fd9f14';
+        const GROUP_ROLE: string = 'SERVICE-ACCESS';
+        const GROUP_TYPE: string = 'LOAD-GROUP';
+
+        cy.server().route({
+          url: Cypress.config('baseUrl') + '/asyncInstantiation/bulk',
+          method: 'POST',
+          status: 200,
+          response: "[]",
+        }).as("expectedPostAsyncInstantiation");
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/rest/models/services/${SERVICE_MODEL_ID}`,
+            200,
+            0,
+            "ServiceTreeWithMultipleChildren_serviceModel",
+          )
+        });
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/serviceWithVnfGroupsChildren_serviceInstance.json').then((res) => {
+
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/aai_get_service_instance_topology/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INSTANCE_ID}`,
+            200, 0,
+            "serviceWithVnfGroupsChildren_serviceInstance",
+          )
+        });
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/searchMembersResponse.json').then((res) => {
+
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/aai_search_group_members/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INVARIANT_ID}/${GROUP_TYPE}/${GROUP_ROLE}`,
+            200, 0,
+            "VnfGroup_searchMembersResponse",
+          )
+        });
+        cy.openIframe(`app/ui/#/servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}&mode=EDIT`);
+
+        cy.getElementByDataTestsId('node-daeb6568-cef8-417f-9075-ed259ce59f48-groupingservicefortest..ResourceInstanceGroup..0-menu-btn')
+          .eq(0).click({force: true}).then(() => {
+          cy.getElementByDataTestsId('context-menu-addGroupMember').click({force: true}).then(() => {
+            cy.getElementByDataTestsId('sourceModelName').contains("vDBE_Svc_vPRS");
+            cy.getElementByDataTestsId('sourceModelInvariant').contains("24632e6b-584b-4f45-80d4-fefd75fd9f14");
+            cy.get('#vnfName').eq(0).get('#VNF1_INSTANCE_NAME').contains('VNF1_INSTANCE_NAME');
+            cy.get('#vnfName').eq(0).get('#VNF1_INSTANCE_ID').contains('VNF1_INSTANCE_ID');
+            cy.getElementByDataTestsId('total-amount').should('have.text', '4 VNFs match your criteria');
+            cy.getElementByDataTestsId('total-selected').should('have.text', '0 VNF selected');
+            cy.getElementByDataTestsId('setMembersBtn').should('have.attr', 'disabled');
+            testCheckbox();
+            testResetAddMemberModal();
+            testUpdateBtn();
+
+          });
+        });
+      });
+
+      it(`vnf group add member get optional members return empty table"`, () => {
+        const SUBSCRIBER_ID: string = "global-customer-id";
+        const SERVICE_TYPE: string = "service-instance-type";
+        const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+        const SERVICE_MODEL_ID: string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+        const SERVICE_INVARIANT_ID: string = '24632e6b-584b-4f45-80d4-fefd75fd9f14';
+        const GROUP_ROLE: string = 'SERVICE-ACCESS';
+        const GROUP_TYPE: string = 'LOAD-GROUP';
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/rest/models/services/${SERVICE_MODEL_ID}`,
+            200,
+            0,
+            "ServiceTreeWithMultipleChildren_serviceModel",
+          )
+        });
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/serviceWithVnfGroupsChildren_serviceInstance.json').then((res) => {
+
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/aai_get_service_instance_topology/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INSTANCE_ID}`,
+            200, 0,
+            "serviceWithVnfGroupsChildren_serviceInstance",
+          )
+        });
+        cy.server()
+          .route({
+            method: 'GET',
+            status: 200,
+            url: Cypress.config('baseUrl') + `/aai_search_group_members/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INVARIANT_ID}/${GROUP_TYPE}/${GROUP_ROLE}`,
+            response: []
+          }).as('VnfGroup_searchMembersResponse');
+
+        cy.openIframe(`app/ui/#/servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}&mode=EDIT`);
+
+        cy.getElementByDataTestsId('node-daeb6568-cef8-417f-9075-ed259ce59f48-groupingservicefortest..ResourceInstanceGroup..0-menu-btn')
+          .eq(0).click({force: true}).then(() => {
+          cy.getElementByDataTestsId('context-menu-addGroupMember').click({force: true}).then(() => {
+            cy.getElementByDataTestsId('total-amount').should('have.text', '0 VNFs match your criteria');
+            cy.getElementByDataTestsId('total-selected').should('have.text', '0 VNF selected');
+            cy.get('.no-result').should('have.text', 'No VNFs were found that can belong to this group.');
+          });
+        })
+      });
+
+      it('Check scaling policy - in Create new service mode', () => {
+        const SUBSCRIBER_ID: string = "e433710f-9217-458d-a79d-1c7aff376d89";
+        const SERVICE_TYPE: string = "TYLER SILVIA";
+        const SERVICE_MODEL_ID: string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+        const SERVICE_INVARIANT_ID: string = 'c989ab9a-33c7-46ec-b521-1b2daef5f047';
+        const GROUP_ROLE: string = 'SERVICE-ACCESS';
+        const GROUP_TYPE: string = 'LOAD-GROUP';
+        const GROUP_NAME_TO_DEPLOY = 'groupingservicefortest..ResourceInstanceGroup..1';
+        const NODE_ID = 'c2b300e6-45de-4e5e-abda-3032bee2de56';
+        const FULL_GROUP_NAME = 'node-' + NODE_ID + '-' + GROUP_NAME_TO_DEPLOY;
+        let serviceModel: JSON;
+        let basicServiceInstance: JSON;
+
+        cy.server().route({
+          url: Cypress.config('baseUrl') + '/asyncInstantiation/bulk',
+          method: 'POST',
+          status: 200,
+          response: "[]",
+        }).as("expectedPostAsyncInstantiation");
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          serviceModel = res;
+        });
+
+        cy.readFile('./cypress/support/jsonBuilders/mocks/jsons/vnfGroupBasicServiceInstance.json').then((res) => {
+          res.optionalGroupMembersMap = {};
+          basicServiceInstance = res;
+        });
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/searchMembersResponse.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/aai_search_group_members/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INVARIANT_ID}/${GROUP_TYPE}/${GROUP_ROLE}`,
+            200, 0,
+            "VnfGroup_searchMembersResponse",
+          )
+        });
+
+        cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((reduxRes) => {
+
+          reduxRes.service.serviceHierarchy[SERVICE_MODEL_ID] = serviceModel;
+
+          reduxRes.service.serviceInstance[SERVICE_MODEL_ID] = basicServiceInstance;
+
+          cy.setReduxState(<any>reduxRes);
+
+          cy.openIframe('app/ui/#/servicePlanning?serviceModelId=' + SERVICE_MODEL_ID);
+          cy.getElementByDataTestsId('node-' + GROUP_NAME_TO_DEPLOY).find(`[data-tests-id='node-type-indicator']`).contains('G');
+          cy.getElementByDataTestsId('node-' + GROUP_NAME_TO_DEPLOY).contains('' + GROUP_NAME_TO_DEPLOY);
+          cy.getElementByDataTestsId('node-' + GROUP_NAME_TO_DEPLOY + '-add-btn').get('i').should('have.class', 'fa-plus-circle');
+
+          cy.getElementByDataTestsId('node-' + GROUP_NAME_TO_DEPLOY + '-add-btn').click({force: true});
+          cy.getElementByDataTestsId('node-' + GROUP_NAME_TO_DEPLOY + '-add-btn').click({force: true});
+
+          cy.getElementByDataTestsId('node-' + NODE_ID + '-' + GROUP_NAME_TO_DEPLOY + '-menu-btn').each((row, index) => {
+            cy.wrap(row).click({force: true}).then(() => {
+              cy.getElementByDataTestsId('context-menu-addGroupMember').click({force: true}).then(() => {
+                cy.getElementByDataTestsId('total-amount').should('have.text', '4 VNFs match your criteria');
+                cy.get('.allCheckboxAreSelected input').click({force: true});
+                cy.getElementByDataTestsId('setMembersBtn').click({force: true}).then(() => {
+                  checkIsErrorAppear(true, 'node-' + NODE_ID + '-' + GROUP_NAME_TO_DEPLOY, 3, index);
+                  cy.get('.toggle-children').click({force: true}).then(() => {
+                    let memberIndex = 3;
+                    while (!index && memberIndex >= 0) {
+                      clickOnVnfMemberAndAssertScaling(memberIndex--, 'context-menu-remove', false, FULL_GROUP_NAME, 3, index);
+                    }
+                  });
+                });
+              });
+            });
+          });
+          clickOnVnfMemberAndAssertScaling(0, 'context-menu-remove', false, FULL_GROUP_NAME, 3, 1);
+          cy.getElementByDataTestsId('deployBtn').should('have.text', 'DEPLOY').click();
+        });
+      });
+
+      it(`Check scaling policy in Edit mode`, () => {
+        const SUBSCRIBER_ID: string = "global-customer-id";
+        const SERVICE_TYPE: string = "service-instance-type";
+        const SERVICE_INSTANCE_ID: string = "f8791436-8d55-4fde-b4d5-72dd2cf13cfb";
+        const SERVICE_MODEL_ID: string = '4117a0b6-e234-467d-b5b9-fe2f68c8b0fc';
+        const SERVICE_INVARIANT_ID: string = '24632e6b-584b-4f45-80d4-fefd75fd9f14';
+        const GROUP_ROLE: string = 'SERVICE-ACCESS';
+        const GROUP_TYPE: string = 'LOAD-GROUP';
+        const NODE_ID = 'daeb6568-cef8-417f-9075-ed259ce59f48';
+        const GROUP_NAME_TO_DEPLOY = 'groupingservicefortest..ResourceInstanceGroup..0';
+        const FULL_GROUP_NAME = 'node-' + NODE_ID + '-' + GROUP_NAME_TO_DEPLOY;
+
+        cy.server().route({
+          url: Cypress.config('baseUrl') + '/asyncInstantiation/bulk',
+          method: 'POST',
+          status: 200,
+          response: "[]",
+        }).as("expectedPostAsyncInstantiation");
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/groupingServiceRoleResponse.json').then((res) => {
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/rest/models/services/${SERVICE_MODEL_ID}`,
+            200,
+            0,
+            "ServiceTreeWithMultipleChildren_serviceModel",
+          )
+        });
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/serviceWithVnfGroupsChildren_serviceInstance.json').then((res) => {
+
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/aai_get_service_instance_topology/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INSTANCE_ID}`,
+            200, 0,
+            "serviceWithVnfGroupsChildren_serviceInstance",
+          )
+        });
+
+        cy.readFile('../vid-automation/src/test/resources/VnfGroup/searchMembersResponse.json').then((res) => {
+
+          jsonBuilderAndMock.basicJson(
+            res,
+            Cypress.config('baseUrl') + `/aai_search_group_members/${SUBSCRIBER_ID}/${SERVICE_TYPE}/${SERVICE_INVARIANT_ID}/${GROUP_TYPE}/${GROUP_ROLE}`,
+            200, 0,
+            "VnfGroup_searchMembersResponse",
+          )
+        });
+
+        cy.openIframe(`app/ui/#/servicePlanning/EDIT?serviceModelId=${SERVICE_MODEL_ID}&subscriberId=${SUBSCRIBER_ID}&serviceType=${SERVICE_TYPE}&serviceInstanceId=${SERVICE_INSTANCE_ID}&mode=EDIT`);
+        cy.getElementByDataTestsId('node-' + NODE_ID + '-' + GROUP_NAME_TO_DEPLOY + '-menu-btn')
+          .eq(0).click({force: true}).then(() => {
+          cy.getElementByDataTestsId('context-menu-addGroupMember').click({force: true}).then(() => {
+            cy.getElementByDataTestsId('total-amount').should('have.text', '4 VNFs match your criteria');
+            cy.get('.allCheckboxAreSelected input').click({force: true});
+            cy.getElementByDataTestsId('setMembersBtn').click({force: true}).then(() => {
+              checkIsErrorAppear(true, FULL_GROUP_NAME, 4, 0);
+
+              clickOnVnfMemberAndAssertScaling(6, 'context-menu-remove', true, FULL_GROUP_NAME, 4, 0);
+              clickOnVnfMemberAndAssertScaling(5, 'context-menu-remove', true, FULL_GROUP_NAME, 4, 0);
+              clickOnVnfMemberAndAssertScaling(0, 'context-menu-delete', false, FULL_GROUP_NAME, 4, 0);
+              clickOnVnfMemberAndAssertScaling(0, 'context-menu-undoDelete', true, FULL_GROUP_NAME, 4, 0);
+              clickOnVnfMemberAndAssertScaling(4, 'context-menu-remove', false, FULL_GROUP_NAME, 4, 0);
+              testResetAddMemberModal();
+              testUpdateBtn();
+            })
+          });
+        });
+      });
+
+      function removeVnfGroup() {
+        cy.getElementByDataTestsId('node-daeb6568-cef8-417f-9075-ed259ce59f48-groupingservicefortest..ResourceInstanceGroup..0-menu-btn')
+          .click({force: true});
+        cy.getElementByDataTestsId('context-menu-remove').click({force: true});
+      }
+
+      function testUpdateBtn() {
+        cy.getElementByDataTestsId('deployBtn').should('have.text', 'UPDATE').click();
+        cy.getReduxState().then((state) => {
+          cy.wait('@expectedPostAsyncInstantiation').then(xhr => {
+            cy.readFile('../vid-automation/src/test/resources/VnfGroup/vnfGroupWithExistingAndNewVnfMembers.json').then((expectedResult) => {
+              cy.deepCompare(xhr.request.body, expectedResult);
+            });
+          });
+        });
+      }
+
+      function testCheckbox() {
+        let totalNumber = 4;
+        cy.get('.allCheckboxAreSelected input').click({force: true});
+        cy.getElementByDataTestsId('setMembersBtn').should('not.have.attr', 'disabled');
+        cy.getElementByDataTestsId('numberOfNotHideVnfMembers').contains(totalNumber);
+        cy.getElementByDataTestsId('numberOfSelectedVnfMembers').contains(totalNumber);
+        cy.get('.sdcCheckboxMember input').eq(0).click({force: true});
+        cy.getElementByDataTestsId('numberOfSelectedVnfMembers').contains(totalNumber - 1);
+        cy.get('.sdcCheckboxMember input').eq(1).click({force: true});
+        cy.getElementByDataTestsId('numberOfSelectedVnfMembers').contains(totalNumber - 2);
+        cy.get('.allCheckboxAreSelected input').click({force: true});
+        cy.getElementByDataTestsId('numberOfSelectedVnfMembers').contains(totalNumber);
+        cy.get('.allCheckboxAreSelected input').click({force: true});
+        cy.getElementByDataTestsId('numberOfSelectedVnfMembers').contains(0);
+
+        cy.getElementByDataTestsId("vnf-members-search").find('input').type("2.0");
+        cy.getElementByDataTestsId('numberOfNotHideVnfMembers').contains(1);
+        cy.getElementByDataTestsId("vnf-members-search").find('input').clear().type("vnf1");
+        cy.getElementByDataTestsId('numberOfNotHideVnfMembers').contains(1);
+        cy.get('.allCheckboxAreSelected input').click({force: true});
+        cy.getElementByDataTestsId('numberOfSelectedVnfMembers').contains(1);
+        cy.getElementByDataTestsId("vnf-members-search").find('input').clear();
+        cy.getElementByDataTestsId('numberOfSelectedVnfMembers').contains(1);
+
+        cy.getElementByDataTestsId('setMembersBtn').click({force: true});
+        //check second time behavior (selected VNFs should be filtered)
+        cy.getElementByDataTestsId('node-daeb6568-cef8-417f-9075-ed259ce59f48-groupingservicefortest..ResourceInstanceGroup..0-menu-btn')
+          .eq(1).click({force: true}).then(() => {
+          cy.getElementByDataTestsId('context-menu-addGroupMember').click({force: true}).then(() => {
+            cy.getElementByDataTestsId('numberOfNotHideVnfMembers').contains(totalNumber - 1);
+            cy.getElementByDataTestsId('cancelBtn').click({force: true});
+          });
+        });
+
+      }
+      function testResetAddMemberModal(): void{
+        cy.getElementByDataTestsId('node-groupingservicefortest..ResourceInstanceGroup..1-add-btn').click({force: true})
+          .getElementByDataTestsId('node-c2b300e6-45de-4e5e-abda-3032bee2de56-groupingservicefortest..ResourceInstanceGroup..1-menu-btn').eq(0).click({force: true}).then(() => {
+          cy.getElementByDataTestsId('context-menu-addGroupMember').click({force: true}).then(() => {
+            cy.getElementByDataTestsId('numberOfNotHideVnfMembers').contains(0);
+            cy.getElementByDataTestsId('cancelBtn').click({force: true});
+          });
+          cy.getElementByDataTestsId('node-c2b300e6-45de-4e5e-abda-3032bee2de56-groupingservicefortest..ResourceInstanceGroup..1-menu-btn').eq(0).click({force: true}).then(() => {
+            cy.getElementByDataTestsId('context-menu-remove').click({force: true});
+          });
+        });
+      }
+      function checkIsErrorAppear(isError: boolean, groupRowId: string, limit: number, index: number) {
+        const isErrorPrefix = isError ? '' : 'not.';
+        cy.getElementByDataTestsId('error-msg-wrapper').should(isErrorPrefix + 'exist');
+        cy.getElementByDataTestsId('deployBtn').should(isErrorPrefix + 'have.attr', 'disabled');
+        cy.getElementByDataTestsId(groupRowId).eq(index).find("[data-tests-id='scaling-policy']").should(isErrorPrefix + 'have.text', 'Limit' + limit);
+        cy.getElementByDataTestsId('error-msg-title').should(isErrorPrefix + 'exist');
+        cy.getElementByDataTestsId('error-msg-sub-title').should(isErrorPrefix + 'exist');
+        cy.getElementByDataTestsId('error-msg-description').should(isErrorPrefix + 'exist');
+      }
+
+      function clickOnVnfMemberAndAssertScaling(childIndex: number, menuItemTestId: string, isError: boolean, groupRowId: string, limit: number, index: number) {
+        cy.get('.tree-children').find('.node-wrapper').eq(childIndex).find('.icon-browse').click({force: true})
+          .getElementByDataTestsId(menuItemTestId).click({force: true}).then(() => {
+          checkIsErrorAppear(isError, groupRowId, limit, index);
+        });
+      }
+
+
+    }
+  );
+});
diff --git a/vid-webpack-master/cypress/integration/iFrames/welcomePage.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/welcomePage.e2e.ts
new file mode 100644 (file)
index 0000000..98d39ff
--- /dev/null
@@ -0,0 +1,40 @@
+///<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('Welcome page', function () {
+  var jsonBuilderAndMock : JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+
+  //describe('Contact us', () => {
+
+    beforeEach(() => {
+      cy.login();
+    });
+
+  afterEach(() => {
+    cy.screenshot();
+  });
+
+    it(`verifying Contact Us link"`, function () {
+    cy.visit('/welcome.htm');
+    cy.get('A[href="mailto:portal@lists.onap.org"]').contains('Contact Us');
+      });
+
+  it(`verifying VID version"`, function () {
+
+    const APP_VERSION = "1902.1948";
+    cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/version.json').then((res) => {
+      jsonBuilderAndMock.basicJson(res,
+        Cypress.config('baseUrl') + '/version',
+        200,
+        0,
+        'app_version');
+    });
+    cy.visit('/welcome.htm');
+    cy.getElementByDataTestsId('app-version').should("text", APP_VERSION);
+  });
+  //  });
+  });
+
+
index 8e78067..6902113 100644 (file)
@@ -18,7 +18,11 @@ describe('Error message popup', function () {
       })
     });
 
-    it('spinner should display after api call', function () {
+    afterEach(() => {
+      cy.screenshot();
+    });
+
+    it('error should display on api error', 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");
index 35f386f..438e7bc 100644 (file)
@@ -17,20 +17,28 @@ describe('Spinner', function () {
       })
     });
 
+    afterEach(() => {
+      cy.screenshot();
+    });
+
     it('spinner should display after api call', function () {
-      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/asyncInstantiation.json').then((res) => {
+      const timeBomb:Date = new Date(2018,6,10,0,0,0); //month 6 is July
+      if (new Date(Date.now()) > timeBomb) {
+
+        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');
+          jsonBuilderInstantiationBuilder.basicJson(res,
+            Cypress.config('baseUrl') + "/asyncInstantiation**",
+            200,
+            4000,
+            "error 500 asyncInstantiation");
+          cy.openIframe('app/ui/#/instantiationStatus');
 
-        cy.get('.spinner')
-          .and('be.visible');
+          cy.get('.sdc-loader')
+            .and('be.visible');
 
-      });
+        });
+      }
     });
   });
 });
index 490016b..19f6881 100644 (file)
@@ -1,6 +1,10 @@
 declare namespace Cypress {
   interface Chainable {
     setReduxState : typeof setReduxState;
+    getReduxState : typeof getReduxState;
+    setTestApiParamToGR: typeof setTestApiParamToGR;
+    setTestApiParamToVNF: typeof setTestApiParamToVNF;
+    buildReduxStateWithServiceRespone: typeof buildReduxStateWithServiceRespone;
   }
 }
 
@@ -14,8 +18,59 @@ function setReduxState(state?: string) : void {
     });
   });
 }
+function getReduxState(): Chainable<any> {
+  return cy.window().then((win) => {
+    let stateRaw = win.sessionStorage.getItem('reduxState');
+    return JSON.parse(stateRaw ?  stateRaw : '{}');
+  });
+}
+
+function setTestApiParamToGR() : void {
+  cy.window().then((win) => {
+    win.sessionStorage.setItem('msoRequestParametersTestApiValue', 'GR_API');
+  });
+}
+
+function setTestApiParamToVNF() : void {
+  cy.window().then((win) => {
+    win.sessionStorage.setItem('msoRequestParametersTestApiValue', 'VNF_API');
+  });
+}
 
+function updateObject(obj: any, key: string, val: any, value:any) {
+  return JSON.parse(JSON.stringify(obj)
+    .replace(new RegExp(`"${key}":"${val}"`), `"${key}":"${value}"`))
+}
 
+function buildReduxStateWithServiceRespone(res: any, serviceId:string, isEcompGeneratedNaming:boolean) :void {
+  res = updateObject(res, "ecomp_generated_naming", !isEcompGeneratedNaming, isEcompGeneratedNaming);
+  cy.window().then((win) => {
+    win.sessionStorage.setItem('reduxState',  JSON.stringify({
+      "global": {
+        "name": null
+      },
+      "service": {
+        "serviceHierarchy": {
+          [serviceId] : res
+        },
+        "serviceInstance": {
+          [serviceId]: {
+            "existingVNFCounterMap": {},
+            "existingVnfGroupCounterMap": {},
+            "existingNetworksCounterMap": {},
+            "vnfs": {},
+            "vnfGroups": {},
+            "isEcompGeneratedNaming": isEcompGeneratedNaming,
+            "existingNames": {}
+          }
+        }
+      }
+    }));
+  });
+}
 
 Cypress.Commands.add('setReduxState', setReduxState);
-
+Cypress.Commands.add('getReduxState', getReduxState);
+Cypress.Commands.add('setTestApiParamToGR', setTestApiParamToGR);
+Cypress.Commands.add('setTestApiParamToVNF',setTestApiParamToVNF);
+Cypress.Commands.add('buildReduxStateWithServiceRespone', buildReduxStateWithServiceRespone);
index 2d30aa1..44e8583 100644 (file)
@@ -7,6 +7,7 @@ declare namespace Cypress {
     isElementEnabled : typeof isElementEnabled;
     hasClass : typeof hasClass;
     getElementByDataTestsId : typeof getElementByDataTestsId;
+    getTagElementContainsText : typeof  getTagElementContainsText;
   }
 }
 
@@ -14,36 +15,42 @@ declare namespace Cypress {
  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);
+  cy.getElementByDataTestsId(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');
+  cy.getElementByDataTestsId(id).should('be:disabled');
 }
 
 function isElementEnabled(id : string) : void {
-  cy.get( "button[data-tests-id='" + id +"']").should('be:enabled');
+  cy.getElementByDataTestsId(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);
+  cy.getElementByDataTestsId(id).should('have.class', className);
 }
 
 function getElementByDataTestsId(dataTestsId : string) : Chainable<JQuery<HTMLElement>> {
   return cy.get( "[data-tests-id='" + dataTestsId +"']");
 }
 
+/**************************************************
+ getTagElementContainsText : return tag with text
+ **************************************************/
+function getTagElementContainsText(tag : string, text : string) : Chainable<JQuery<HTMLElement>> {
+  return cy.contains(tag,text);
+}
+
 
 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);
+Cypress.Commands.add('getTagElementContainsText', getTagElementContainsText);
index 714daf9..4e6b5e8 100644 (file)
@@ -4,6 +4,7 @@ declare namespace Cypress {
     blurInput : typeof blurInput;
     focusInput : typeof focusInput;
     shouldInputContainsText: typeof shouldInputContainsText;
+    clearInput: typeof clearInput;
   }
 }
 
@@ -15,32 +16,38 @@ function typeToInput(id : string, text : string) : void {
     .type(text, {force: true});
 }
 
+/**********************************
+ clear input
+ *********************************/
+function clearInput(id : string) : void {
+  cy.get( "[data-tests-id='" + id +"']")
+    .clear();
+}
+
 /********************
  blur input with id
  ********************/
 function blurInput(id : string) : void {
-  cy.get( "[data-tests-id='" + id +"']")
-    .blur();
+  cy.getElementByDataTestsId(id).blur();
 }
 
 /********************
  focus input with id
  ********************/
 function focusInput(id : string) : void {
-  cy.get( "[data-tests-id='" + id +"']")
-    .focus();
+  cy.getElementByDataTestsId(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')
+  cy.getElementByDataTestsId(id).contains('text')
 }
 
 Cypress.Commands.add('typeToInput', typeToInput);
 Cypress.Commands.add('blurInput', blurInput);
 Cypress.Commands.add('focusInput', focusInput);
 Cypress.Commands.add('shouldInputContainsText', shouldInputContainsText);
+Cypress.Commands.add('clearInput', clearInput);
 
index 452323d..1f8eea0 100644 (file)
@@ -1,6 +1,7 @@
 declare namespace Cypress {
   interface Chainable {
     selectDropdownOptionByText : typeof selectDropdownOptionByText;
+    checkIsOptionSelected : typeof checkIsOptionSelected;
   }
 }
 
@@ -12,5 +13,14 @@ function selectDropdownOptionByText(selectId : string, optionText : string) : vo
     .select(optionText);
 }
 
+/************************************************
+ check if  option is selected
+ ************************************************/
+function checkIsOptionSelected(selectId : string, optionText : string) : void {
+  cy.getElementByDataTestsId(selectId)
+    .should('have.value', optionText)
+}
+
 Cypress.Commands.add('selectDropdownOptionByText', selectDropdownOptionByText);
+Cypress.Commands.add('checkIsOptionSelected', checkIsOptionSelected);
 
index 7b8506a..a757a16 100644 (file)
 // Import commands.js using ES2015 syntax:
 import './commands';
 import './steps/login.step';
+import './steps/fill.service.popup.step';
+import './steps/fill.vnf.popup.step';
+import './steps/fill.network.step';
+import './steps/fill.vfModule.step';
+import './steps/menu.step';
+import './steps/openInstanceAuditInfoModal.step';
 import './elements/element.actions';
 import './elements/element.input.actions';
 import './elements/element.select.actions';
@@ -23,8 +29,21 @@ import './application/application.session.actions';
 import './elements/element.table.actions';
 import './jsonBuilders/mocks/aai.mock';
 import './jsonBuilders/mocks/vid.mock';
+import './jsonBuilders/mocks/permission.mock';
+
+
+import './steps/general/compareDeepObjects.step';
+import './steps/drawingBoard/drawingBoardModel.steps';
+import './steps/drawingBoard/drawingBoardTree.steps';
+import './steps/genericForm/genericFormAction.steps';
+import './steps/drawingBoard/general.steps';
+import './steps/general/clickOutside.step';
+import './steps/drawingBoard/drawingBoardComponentInfo.steps';
+import './steps/genericForm/checkPopover.step';
 
 // Alternatively you can use CommonJS syntax:
 // require('./commands')
 
-
+Cypress.Screenshot.defaults({
+  capture: 'runner'
+});
index 0bab4e1..2583d46 100644 (file)
@@ -1,6 +1,9 @@
 export class JsonBuilder<T> implements IJsonBuilder<T>{
-  currentValue: T;
+  currentValue?: T;
 
+  constructor(currentValue ?: T){
+    this.currentValue = currentValue;
+  }
   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;
@@ -17,9 +20,9 @@ export class JsonBuilder<T> implements IJsonBuilder<T>{
           response: JSON.stringify(this.currentValue)
         }).as(alias);
   }
-  public basicMock(jsonPath: string, url: string) {
+  public basicMock(jsonPath: string, url: string ,changeResFunc?: Function) {
     cy.readFile(jsonPath).then((res) => {
-      this.basicJson(res, url, 200, 0, url,);
+      this.basicJson(res, url, 200, 0, url, changeResFunc);
     })
   }
 }
index a954877..6cb8f61 100644 (file)
@@ -3,6 +3,8 @@ declare namespace Cypress {
     initAAIMock: typeof initAAIMock;
     initAlaCarteService : typeof initAlaCarteService;
     initZones : typeof initZones;
+    initTenants : typeof initTenants;
+    initSearchVNFMemebers : typeof  initSearchVNFMemebers;
   }
 }
 
@@ -18,6 +20,18 @@ function initGetSubscribers(response? : JSON) : void {
   });
 }
 
+function initAaiGetFullSubscribers(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_full_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()
@@ -42,6 +56,22 @@ function initAlaCarteService(response? : JSON) : void {
   });
 }
 
+
+
+
+
+function initTenants(response? : JSON) : void {
+  cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/tenants.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        status: 200,
+        url: Cypress.config('baseUrl') + "/aai_get_tenants/**",
+        response: response ? response : res
+      }).as('initTenants')
+  });
+}
+
 function initAAIServices(response? : JSON) : void {
   cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiServices.json').then((res) => {
     cy.server()
@@ -66,15 +96,34 @@ function initZones(response? : JSON) : void {
   });
 }
 
+//Mock of vnf's that members for VNF Group
+function initSearchVNFMemebers(response? : JSON) : void {
+  cy.readFile('../vid-automation/src/test/resources/VnfGroup/searchMembersResponse.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        status : 200,
+        url : Cypress.config('baseUrl') + "/aai_search_group_members/**",
+        response : response ? response : res
+      }).as(('searchVNFMembers'));
+  });
+}
+
+
 
 function initAAIMock(): void {
+  initAaiGetFullSubscribers();
   initGetSubscribers();
   initAAIServices();
+  initTenants();
 }
 
 
 Cypress.Commands.add('initAAIMock', initAAIMock);
 Cypress.Commands.add('initAlaCarteService', initAlaCarteService);
 Cypress.Commands.add('initZones', initZones);
+Cypress.Commands.add('initTenants', initTenants);
+Cypress.Commands.add('initAaiGetFullSubscribers', initAaiGetFullSubscribers);
+Cypress.Commands.add('initSearchVNFMemebers', initSearchVNFMemebers);
 
 
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aLaCarteAuditInfoMSO.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aLaCarteAuditInfoMSO.json
new file mode 100644 (file)
index 0000000..290ca6c
--- /dev/null
@@ -0,0 +1,13 @@
+[
+  {
+    "id": null,
+    "jobId": "20fb575c-130a-4c5e-b434-50440bf992ec",
+    "instanceName": "instance name 1",
+    "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/aaiGetHomingData.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiGetHomingData.json
new file mode 100644 (file)
index 0000000..d8a7faa
--- /dev/null
@@ -0,0 +1,7 @@
+{
+  "tenantName": "USP-SIP-IC-24335-T-01",
+  "tenantID": "092eb9e8e4b7412e8787dd091bc58e86",
+  "cloudOwner": "irma-aic",
+  "cloudRegionID": "JANET25",
+  "is-permitted": true
+}
index 3435ff0..61708d8 100644 (file)
@@ -7,8 +7,18 @@
       "isPermitted": true,
       "serviceInstanceId": "3f93c7cb-2fd0-4557-9514-e189b7b04f9d",
       "serviceInstanceName": "vid-test-444",
-      "serviceType": "VIRTUAL USP",
-      "subscriberName": "USP VOICE"
+      "serviceType": "TYLER SILVIA",
+      "subscriberName": "SILVIA ROBBINS"
+    },
+    {
+      "aaiModelInvariantId": "12343f9e-3244-4d8f-a8e0-0e5d7a29eda9",
+      "aaiModelVersionId": "12344bb4-a416-4b4e-997e-0059973630b9",
+      "globalCustomerId": "e433710f-9217-458d-a79d-1c7aff376d89",
+      "isPermitted": true,
+      "serviceInstanceId": "c187e9fe-40c3-4862-b73e-84ff056205f61234",
+      "serviceInstanceName": "test_fabric_config",
+      "serviceType": "TYLER SILVIA",
+      "subscriberName": "SILVIA ROBBINS"
     }
   ]
 }
index 7b4440d..1528c75 100644 (file)
 {
-  "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"
+  "service": [
+    {
+      "service-id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+      "service-description": "SCOTTIE",
+      "resource-version": "1494001985150",
+      "is-permitted": true
+    },
+    {
+      "service-id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+      "service-description": "IGNACIO",
+      "resource-version": "1494001922171",
+      "is-permitted": true
+    },
+    {
+      "service-id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+      "service-description": "Christie",
+      "resource-version": "1494001855144",
+      "is-permitted": true
+    },
+    {
+      "service-id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+      "service-description": "Enhanced Services",
+      "resource-version": "1494001980153",
+      "is-permitted": true
+    },
+    {
+      "service-id": "vTerrance",
+      "service-description": "vTerrance",
+      "resource-version": "1484865266",
+      "is-permitted": true
+    },
+    {
+      "service-id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+      "service-description": "vSCP",
+      "resource-version": "1494001903012",
+      "is-permitted": true
+    },
+    {
+      "service-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+      "service-description": "Emanuel",
+      "resource-version": "1503954056794",
+      "is-permitted": true
+    },
+    {
+      "service-id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+      "service-description": "BVOIP",
+      "resource-version": "1490910089351",
+      "is-permitted": true
+    },
+    {
+      "service-id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+      "service-description": "LINDSEY",
+      "resource-version": "1490910095155",
+      "is-permitted": true
+    },
+    {
+      "service-id": "LRSI-OSPF",
+      "service-description": "LRSI-OSPF",
+      "resource-version": "1494001863930",
+      "is-permitted": true
+    },
+    {
+      "service-id": "vRosemarie",
+      "service-description": "HNGATEWAY",
+      "resource-version": "1501192849249",
+      "is-permitted": true
+    },
+    {
+      "service-id": "vHNPaas",
+      "service-description": "WILKINS",
+      "resource-version": "1501192982895",
+      "is-permitted": true
+    },
+    {
+      "service-id": "e433710f-9217-458d-a79d-1c7aff376d89",
+      "service-description": "TYLER SILVIA",
+      "resource-version": "1494001802638",
+      "is-permitted": true
+    },
+    {
+      "service-id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+      "service-description": "VROUTER",
+      "resource-version": "1492533254036",
+      "is-permitted": true
+    },
+    {
+      "service-id": "Cisneros",
+      "service-description": "vMuriel",
+      "resource-version": "1490910058887",
+      "is-permitted": true
+    },
+    {
+      "service-id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+      "service-description": "CARA Griffin",
+      "resource-version": "1498053422512",
+      "is-permitted": true
+    },
+    {
+      "service-id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+      "service-description": "DARREN MCGEE",
+      "resource-version": "1494001913639",
+      "is-permitted": true
+    },
+    {
+      "service-id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+      "service-description": "Transport",
+      "resource-version": "1506361785997",
+      "is-permitted": true
+    },
+    {
+      "service-id": "vSalvatore",
+      "service-description": "vSalvatore",
+      "resource-version": "1494001900545",
+      "is-permitted": true
+    },
+    {
+      "service-id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+      "service-description": "Josefina",
+      "resource-version": "1494001941772",
+      "is-permitted": true
+    },
+    {
+      "service-id": "vHubbard",
+      "service-description": "vHubbard",
+      "resource-version": "1494001988229",
+      "is-permitted": true
+    },
+    {
+      "service-id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+      "service-description": "DARREN MCGEE",
+      "resource-version": "1494001817126",
+      "is-permitted": true
     }
-  },
-  "collectionResource": {},
-  "configurations": {},
-  "serviceProxies": {},
-  "vfModules": {},
-  "volumeGroups": {},
-  "pnfs": {}
+  ]
 }
index 0063a9d..f2ce087 100644 (file)
@@ -1,12 +1,12 @@
 {
   "global-customer-id": "e433710f-9217-458d-a79d-1c7aff376d89",
-  "subscriber-name": "USP VOICE",
+  "subscriber-name": "SILVIA ROBBINS",
   "subscriber-type": "INFRA",
   "resource-version": "1494001938080",
   "service-subscriptions": {
     "service-subscription": [
       {
-        "service-type": "HOSTED COMMUNICATIONS",
+        "service-type": "DARREN MCGEE",
         "resource-version": "1494001920845",
         "service-instances": {
           "service-instance": [
           ]
         },
         "is-permitted": false
+      },
+      {
+        "service-type":"TYLER SILVIA",
+        "resource-version":"1501700976809",
+        "service-instances":{
+          "service-instance":[
+            {
+              "service-instance-id": "c187e9fe-40c3-4862-b73e-84ff056205f61234",
+              "service-instance-name": "test_fabric_config",
+              "model-invariant-id": "12343f9e-3244-4d8f-a8e0-0e5d7a29eda9",
+              "model-version-id": "12344bb4-a416-4b4e-997e-0059973630b9",
+              "resource-version": "1500789244674",
+              "orchestration-status": "Assigned"
+            },
+            {
+              "service-instance-id": "c187e9fe-40c3-4862-b73e-84ff056205f69000",
+              "service-instance-name": "test_fabric_config",
+              "model-invariant-id": "90003f9e-3244-4d8f-a8e0-0e5d7a29eda9",
+              "model-version-id": "90004bb4-a416-4b4e-997e-0059973630b9",
+              "resource-version": "1500789244674",
+              "orchestration-status": "Active"
+            },
+            {
+              "service-instance-id": "c187e9fe-40c3-4862-b73e-84ff056205f61000",
+              "service-instance-name": "test_fabric_config",
+              "model-invariant-id": "10003f9e-3244-4d8f-a8e0-0e5d7a29eda9",
+              "model-version-id": "10004bb4-a416-4b4e-997e-0059973630b9",
+              "resource-version": "1500789244674",
+              "orchestration-status": "pendingdeLete"
+            },
+            {
+              "service-instance-id": "c187e9fe-40c3-4862-b73e-84ff056205f65678",
+              "service-instance-name": "test_fabric_config",
+              "model-invariant-id": "12343f9e-3244-4d8f-a8e0-0e5d7a29eda9",
+              "model-version-id": "12344bb4-a416-4b4e-997e-0059973630b9",
+              "resource-version": "1500789244674",
+              "orchestration-status": "Created"
+            },
+            {
+              "service-instance-id":"3f93c7cb-2fd0-4557-9514-e189b7b04f9d",
+              "service-instance-name":"usp_voice_inst",
+              "persona-model-id":null,
+              "persona-model-version":null,
+              "resource-version":"1502391806301",
+              "orchestration-status":"Active",
+              "model-invariant-id":"64dbe153-48c6-4d6f-95e7-12ff4cce9871",
+              "model-version-id":"4e8b6372-dea3-4028-81d0-16eba59c94fd"
+            }
+          ]
+        },
+        "is-permitted":true
       }
     ]
   }
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForActiveFabricConfigService.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForActiveFabricConfigService.json
new file mode 100644 (file)
index 0000000..38c7606
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "inventory-response-item": [
+    {
+      "model-name": "0eOHz2Yh8WJcBYzKy0791234",
+      "service-instance": {
+        "service-instance-id": "c187e9fe-40c3-4862-b73e-84ff056205f69000",
+        "service-instance-name": "test_fabric_config"
+      },
+      "extra-properties": {},
+      "inventory-response-items": {
+        "inventory-response-item": [
+          {
+            "model-name": "Fabric-Configuration-Instance",
+            "configuration": {
+              "configuration-id": "1-fabric-config-LB1113",
+              "configuration-name": "dummy_instance_1",
+              "configuration-type": "fabric-configuration-type-1",
+              "configuration-sub-type": "fabric-configuration-sub-type-1",
+              "model-invariant-id": "model-invariant-id-1",
+              "model-version-id": "model-version-id-1",
+              "orchestration-status": "Assigned",
+              "operational-status": "",
+              "configuration-selflink": "",
+              "model-customization-id": "model-customization-id-1",
+              "resource-version": "1504038855716"
+            },
+            "extra-properties": {
+            }
+          },
+          {
+            "model-name": "Fabric-Configuration-Instance",
+            "configuration": {
+              "configuration-id": "2-fabric-config-LB1113",
+              "configuration-name": "dummy_instance_2",
+              "configuration-type": "fabric-configuration-type-2",
+              "configuration-sub-type": "fabric-configuration-sub-type-2",
+              "model-invariant-id": "model-invariant-id-2",
+              "model-version-id": "model-version-id-2",
+              "orchestration-status": "Assigned",
+              "operational-status": "",
+              "configuration-selflink": "",
+              "model-customization-id": "model-customization-id-2",
+              "resource-version": "1504038855712"
+            },
+            "extra-properties": {
+            }
+          }
+        ]
+      }
+    }
+  ]
+}
index 0706036..d6107b8 100644 (file)
                     "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",
+                    "gateway-address": "10.0.0.10",
+                    "network-start-address": "10.0.0.10",
                     "cidr-mask": "26",
                     "ip-version": "4",
                     "orchestration-status": "Created",
                     "dhcp-enabled": true,
-                    "dhcp-start": "107.243.49.3",
-                    "dhcp-end": "107.243.49.62",
+                    "dhcp-start": "10.0.0.10",
+                    "dhcp-end": "10.0.0.10",
                     "ip-assignment-direction": "false",
                     "resource-version": "1511279493791"
                   },
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForCreatedFabricConfigService.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForCreatedFabricConfigService.json
new file mode 100644 (file)
index 0000000..0ad741c
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "inventory-response-item": [
+    {
+      "model-name": "0eOHz2Yh8WJcBYzKy0791234",
+      "service-instance": {
+        "service-instance-id": "c187e9fe-40c3-4862-b73e-84ff056205f69000",
+        "service-instance-name": "test_fabric_config"
+      },
+      "extra-properties": {},
+      "inventory-response-items": {
+        "inventory-response-item": [
+          {
+            "model-name": "Fabric-Configuration-Instance",
+            "configuration": {
+              "configuration-id": "1-fabric-config-LB1113",
+              "configuration-name": "dummy_instance_1",
+              "configuration-type": "fabric-configuration-type-1",
+              "configuration-sub-type": "fabric-configuration-sub-type-1",
+              "model-invariant-id": "model-invariant-id-1",
+              "model-version-id": "model-version-id-1",
+              "orchestration-status": "Active",
+              "operational-status": "",
+              "configuration-selflink": "",
+              "model-customization-id": "model-customization-id-1",
+              "resource-version": "1504038855716"
+            },
+            "extra-properties": {
+            }
+          },
+          {
+            "model-name": "Fabric-Configuration-Instance",
+            "configuration": {
+              "configuration-id": "2-fabric-config-LB1113",
+              "configuration-name": "dummy_instance_2",
+              "configuration-type": "fabric-configuration-type-2",
+              "configuration-sub-type": "fabric-configuration-sub-type-2",
+              "model-invariant-id": "model-invariant-id-2",
+              "model-version-id": "model-version-id-2",
+              "orchestration-status": "Assigned",
+              "operational-status": "",
+              "configuration-selflink": "",
+              "model-customization-id": "model-customization-id-2",
+              "resource-version": "1504038855712"
+            },
+            "extra-properties": {
+            }
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForDeactivatedFabricConfigService.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForDeactivatedFabricConfigService.json
new file mode 100644 (file)
index 0000000..b224e32
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "inventory-response-item": [
+    {
+      "model-name": "0eOHz2Yh8WJcBYzKy0791234",
+      "service-instance": {
+        "service-instance-id": "c187e9fe-40c3-4862-b73e-84ff056205f61000",
+        "service-instance-name": "test_fabric_config"
+      },
+      "extra-properties": {},
+      "inventory-response-items": {
+        "inventory-response-item": [
+          {
+            "model-name": "Fabric-Configuration-Instance",
+            "configuration": {
+              "configuration-id": "1-fabric-config-LB1113",
+              "configuration-name": "dummy_instance_1",
+              "configuration-type": "fabric-configuration-type-1",
+              "configuration-sub-type": "fabric-configuration-sub-type-1",
+              "model-invariant-id": "model-invariant-id-1",
+              "model-version-id": "model-version-id-1",
+              "orchestration-status": "Active",
+              "operational-status": "",
+              "configuration-selflink": "",
+              "model-customization-id": "model-customization-id-1",
+              "resource-version": "1504038855716"
+            },
+            "extra-properties": {
+            }
+          },
+          {
+            "model-name": "Fabric-Configuration-Instance",
+            "configuration": {
+              "configuration-id": "2-fabric-config-LB1113",
+              "configuration-name": "dummy_instance_2",
+              "configuration-type": "fabric-configuration-type-2",
+              "configuration-sub-type": "fabric-configuration-sub-type-2",
+              "model-invariant-id": "model-invariant-id-2",
+              "model-version-id": "model-version-id-2",
+              "orchestration-status": "Assigned",
+              "operational-status": "",
+              "configuration-selflink": "",
+              "model-customization-id": "model-customization-id-2",
+              "resource-version": "1504038855712"
+            },
+            "extra-properties": {
+            }
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForFabricConfigService.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForFabricConfigService.json
new file mode 100644 (file)
index 0000000..ddd673b
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "inventory-response-item": [
+    {
+      "model-name": "0eOHz2Yh8WJcBYzKy0791234",
+      "service-instance": {
+        "service-instance-id": "c187e9fe-40c3-4862-b73e-84ff056205f61234",
+        "service-instance-name": "test_fabric_config"
+      },
+      "extra-properties": {},
+      "inventory-response-items": {
+        "inventory-response-item": [
+          {
+            "model-name": "Fabric-Configuration-Instance",
+            "configuration": {
+              "configuration-id": "1-fabric-config-LB1113",
+              "configuration-name": "dummy_instance_1",
+              "configuration-type": "fabric-configuration-type-1",
+              "configuration-sub-type": "fabric-configuration-sub-type-1",
+              "model-invariant-id": "model-invariant-id-1",
+              "model-version-id": "model-version-id-1",
+              "orchestration-status": "Assigned",
+              "operational-status": "",
+              "configuration-selflink": "",
+              "model-customization-id": "model-customization-id-1",
+              "resource-version": "1504038855716"
+            },
+            "extra-properties": {
+            }
+          },
+          {
+            "model-name": "Fabric-Configuration-Instance",
+            "configuration": {
+              "configuration-id": "2-fabric-config-LB1113",
+              "configuration-name": "dummy_instance_2",
+              "configuration-type": "fabric-configuration-type-2",
+              "configuration-sub-type": "fabric-configuration-sub-type-2",
+              "model-invariant-id": "model-invariant-id-2",
+              "model-version-id": "model-version-id-2",
+              "orchestration-status": "Active",
+              "operational-status": "",
+              "configuration-selflink": "",
+              "model-customization-id": "model-customization-id-2",
+              "resource-version": "1504038855712"
+            },
+            "extra-properties": {
+            }
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForServiceWithSomeVFModule.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForServiceWithSomeVFModule.json
new file mode 100644 (file)
index 0000000..0a0de81
--- /dev/null
@@ -0,0 +1,355 @@
+{
+  "inventory-response-item": [
+    {
+      "model-name": "1707vidnf",
+      "service-instance": {
+        "service-instance-id": "3f93c7cb-2fd0-4557-9514-e189b7b04f9d",
+        "service-instance-name": "vid-test-444"
+      },
+      "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": "af94e0b5-454c-4fd8-b62b-ef27632afd22",
+              "model-version-id": "3d2657a7-6816-4662-93f0-26e315611336",
+              "model-customization-id": "d279139c-4b85-48ff-8ac4-9b83a6fc6da7",
+              "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": "a06b0a2b-0cb5-401c-bf29-b64bb6a114b9",
+                    "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": "df35ebf5-880b-4052-b4dc-5fbf38a423ca",
+                    "model-version-id": "bbf63386-42ec-4cae-a6a1-a8dade4e09e1",
+                    "model-customization-id": "56f23f2a-de4b-4f72-a51c-439970350885",
+                    "module-index": 0
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "model-name": "VidPcrf051517..pcrf_nimbus_pcm..module-4",
+                  "vf-module": {
+                    "vf-module-id": "f91515e5-cf8d-4abf-aacc-5bc5c5a47f09",
+                    "vf-module-name": "gg",
+                    "orchestration-status": "assiGned",
+                    "is-base-vf-module": false,
+                    "resource-version": "1504694876599",
+                    "model-invariant-id": "eb5a1e09-7f46-4f1c-ab7a-b017bad95261",
+                    "model-version-id": "fa1c8558-006c-4fb6-82f2-4fc0646d6b06",
+                    "model-customization-id": "222bd8f2-341d-4419-aa0e-98398fa34050",
+                    "module-index": 1
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "model-name": "VidPcrf051517..pcrf_nimbus_pcm..module-5",
+                  "vf-module": {
+                    "vf-module-id": "f91515e5-cf8d-4abf-aacc-5bc5c5a47f05",
+                    "vf-module-name": "ABC",
+                    "orchestration-status": "Created",
+                    "is-base-vf-module": false,
+                    "resource-version": "1504694876599",
+                    "model-invariant-id": "eb5a1e09-7f46-4f1c-ab7a-b017bad95265",
+                    "model-version-id": "fa1c8558-006c-4fb6-82f2-4fc0646d6b05",
+                    "model-customization-id": "222bd8f2-341d-4419-aa0e-98398fa34055",
+                    "module-index": 1
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "model-name": "VidPcrf051517..pcrf_nimbus_pcm..module-4",
+                  "vf-module": {
+                    "vf-module-id": "a231a99c-7e75-4d6d-a0fb-5c7d26f30f77",
+                    "vf-module-name": "my_vfModule",
+                    "orchestration-status": "pending-delete",
+                    "is-base-vf-module": false,
+                    "resource-version": "1505044772033",
+                    "model-invariant-id": "eb5a1e09-7f46-4f1c-ab7a-b017bad95261",
+                    "model-version-id": "fa1c8558-006c-4fb6-82f2-4fc0646d6b06",
+                    "model-customization-id": "222bd8f2-341d-4419-aa0e-98398fa34050",
+                    "module-index": 0
+                  },
+                  "extra-properties": {}
+                }
+              ]
+            }
+          },
+          {
+            "model-name": "VID-PCRF-05-15-17",
+            "generic-vnf": {
+              "vnf-id": "0846287b-65bf-45a6-88f6-6a1af4149fac",
+              "vnf-name": "kjkjk",
+              "vnf-type": "1707vidnf/VID-PCRF-05-15-17 0",
+              "service-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+              "prov-status": "PREPROV",
+              "orchestration-status": "Created",
+              "in-maint": false,
+              "is-closed-loop-disabled": false,
+              "resource-version": "1504008534044",
+              "model-invariant-id": "af94e0b5-454c-4fd8-b62b-ef27632afd22",
+              "model-version-id": "3d2657a7-6816-4662-93f0-26e315611336",
+              "model-customization-id": "d279139c-4b85-48ff-8ac4-9b83a6fc6da7",
+              "nf-type": "",
+              "nf-function": "",
+              "nf-role": "",
+              "nf-naming-code": ""
+            },
+            "extra-properties": {},
+            "inventory-response-items": {
+              "inventory-response-item": [
+                {
+                  "volume-group": {
+                    "volume-group-id": "973cb0a6-f0b5-4a45-b995-db265bda182c",
+                    "volume-group-name": "fdgfg",
+                    "heat-stack-id": "",
+                    "vnf-type": "1707vidnf/null",
+                    "orchestration-status": "Pending",
+                    "vf-module-model-customization-id": "a06b0a2b-0cb5-401c-bf29-b64bb6a114b9",
+                    "resource-version": "1508413877324"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "volume-group": {
+                    "volume-group-id": "09203a8b-29e7-4e76-8dd0-565f6a081f82",
+                    "volume-group-name": "fdgfd",
+                    "heat-stack-id": "",
+                    "vnf-type": "1707vidnf/null",
+                    "orchestration-status": "Pending",
+                    "vf-module-model-customization-id": "a06b0a2b-0cb5-401c-bf29-b64bb6a114b9",
+                    "resource-version": "1508413828948"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "model-name": "VidPcrf051517..pcrf_nimbus_pcm..module-4",
+                  "vf-module": {
+                    "vf-module-id": "a9b70ac0-5917-4203-a308-0e6920e6d09b",
+                    "vf-module-name": "vf_module2",
+                    "orchestration-status": "PendingCreate",
+                    "is-base-vf-module": false,
+                    "resource-version": "1504694397912",
+                    "model-invariant-id": "eb5a1e09-7f46-4f1c-ab7a-b017bad95261",
+                    "model-version-id": "fa1c8558-006c-4fb6-82f2-4fc0646d6b06",
+                    "model-customization-id": "222bd8f2-341d-4419-aa0e-98398fa34050",
+                    "module-index": 0
+                  },
+                  "extra-properties": {}
+                }
+              ]
+            }
+          },
+          {
+            "model-name": "VID-PCRF-05-15-17",
+            "generic-vnf": {
+              "vnf-id": "9908b762-136f-4b1f-8eb4-ef670ef58bb4",
+              "vnf-name": "uiui",
+              "vnf-type": "1707vidnf/VID-PCRF-05-15-17 0",
+              "service-id": "vRosemarie",
+              "prov-status": "PREPROV",
+              "orchestration-status": "Created",
+              "in-maint": false,
+              "is-closed-loop-disabled": false,
+              "resource-version": "1504516218649",
+              "model-invariant-id": "af94e0b5-454c-4fd8-b62b-ef27632afd22",
+              "model-version-id": "3d2657a7-6816-4662-93f0-26e315611336",
+              "model-customization-id": "d279139c-4b85-48ff-8ac4-9b83a6fc6da7",
+              "nf-type": "",
+              "nf-function": "",
+              "nf-role": "",
+              "nf-naming-code": ""
+            },
+            "extra-properties": {}
+          },
+          {
+            "model-name": "VID-PCRF-05-15-17",
+            "generic-vnf": {
+              "vnf-id": "543931f5-e50e-45a2-a69f-ab727e4c7f2f",
+              "vnf-name": "sdfsdfdsf",
+              "vnf-type": "1707vidnf/VID-PCRF-05-15-17 0",
+              "service-id": "LRSI-OSPF",
+              "prov-status": "PREPROV",
+              "orchestration-status": "Created",
+              "in-maint": false,
+              "is-closed-loop-disabled": false,
+              "resource-version": "1506509961062",
+              "model-invariant-id": "af94e0b5-454c-4fd8-b62b-ef27632afd22",
+              "model-version-id": "3d2657a7-6816-4662-93f0-26e315611336",
+              "model-customization-id": "d279139c-4b85-48ff-8ac4-9b83a6fc6da7",
+              "nf-type": "",
+              "nf-function": "",
+              "nf-role": "",
+              "nf-naming-code": ""
+            },
+            "extra-properties": {}
+          },
+          {
+            "model-name": "VID-PCRF-05-15-17",
+            "generic-vnf": {
+              "vnf-id": "25e84884-22d5-44c9-8212-cb459f63e0ba",
+              "vnf-name": "sdada",
+              "vnf-type": "1707vidnf/VID-PCRF-05-15-17 0",
+              "service-id": "Cisneros",
+              "prov-status": "PREPROV",
+              "orchestration-status": "Created",
+              "in-maint": false,
+              "is-closed-loop-disabled": false,
+              "resource-version": "1506509479125",
+              "model-invariant-id": "af94e0b5-454c-4fd8-b62b-ef27632afd22",
+              "model-version-id": "3d2657a7-6816-4662-93f0-26e315611336",
+              "model-customization-id": "d279139c-4b85-48ff-8ac4-9b83a6fc6da7",
+              "nf-type": "",
+              "nf-function": "",
+              "nf-role": "",
+              "nf-naming-code": ""
+            },
+            "extra-properties": {}
+          },
+          {
+            "model-name": "VID-PCRF-05-15-17",
+            "generic-vnf": {
+              "vnf-id": "013fb0ba-977b-496c-9faa-7f8e5f083eec",
+              "vnf-name": "gvb",
+              "vnf-type": "1707vidnf/VID-PCRF-05-15-17 0",
+              "service-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+              "prov-status": "PREPROV",
+              "orchestration-status": "Created",
+              "in-maint": false,
+              "is-closed-loop-disabled": false,
+              "resource-version": "1508048678134",
+              "model-invariant-id": "af94e0b5-454c-4fd8-b62b-ef27632afd22",
+              "model-version-id": "3d2657a7-6816-4662-93f0-26e315611336",
+              "model-customization-id": "d279139c-4b85-48ff-8ac4-9b83a6fc6da7",
+              "nf-type": "",
+              "nf-function": "",
+              "nf-role": "",
+              "nf-naming-code": ""
+            },
+            "extra-properties": {}
+          },
+          {
+            "model-name": "VID-PCRF-05-15-17",
+            "generic-vnf": {
+              "vnf-id": "06914296-cb46-4b62-9453-329a706a6cbb",
+              "vnf-name": "lkllll",
+              "vnf-type": "1707vidnf/VID-PCRF-05-15-17 0",
+              "service-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+              "prov-status": "PREPROV",
+              "orchestration-status": "Created",
+              "in-maint": false,
+              "is-closed-loop-disabled": false,
+              "resource-version": "1504507099829",
+              "model-invariant-id": "af94e0b5-454c-4fd8-b62b-ef27632afd22",
+              "model-version-id": "3d2657a7-6816-4662-93f0-26e315611336",
+              "model-customization-id": "d279139c-4b85-48ff-8ac4-9b83a6fc6da7",
+              "nf-type": "",
+              "nf-function": "",
+              "nf-role": "",
+              "nf-naming-code": ""
+            },
+            "extra-properties": {}
+          },
+          {
+            "model-name": "VID-PCRF-05-15-17",
+            "generic-vnf": {
+              "vnf-id": "c55da606-cf38-42c7-bc3c-be8e23b19299",
+              "vnf-name": "ss",
+              "vnf-type": "1707vidnf/VID-PCRF-05-15-17 0",
+              "service-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+              "prov-status": "PREPROV",
+              "orchestration-status": "Created",
+              "in-maint": false,
+              "is-closed-loop-disabled": false,
+              "resource-version": "1508048827342",
+              "model-invariant-id": "af94e0b5-454c-4fd8-b62b-ef27632afd22",
+              "model-version-id": "3d2657a7-6816-4662-93f0-26e315611336",
+              "model-customization-id": "d279139c-4b85-48ff-8ac4-9b83a6fc6da7",
+              "nf-type": "",
+              "nf-function": "",
+              "nf-role": "",
+              "nf-naming-code": ""
+            },
+            "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": "10.0.0.10",
+                    "network-start-address": "10.0.0.10",
+                    "cidr-mask": "26",
+                    "ip-version": "4",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": true,
+                    "dhcp-start": "10.0.0.10",
+                    "dhcp-end": "10.0.0.10",
+                    "ip-assignment-direction": "false",
+                    "resource-version": "1511279493791"
+                  },
+                  "extra-properties": {}
+                }
+              ]
+            }
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/activeFabricConfigService.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/activeFabricConfigService.json
new file mode 100644 (file)
index 0000000..f98a8d4
--- /dev/null
@@ -0,0 +1,51 @@
+{
+  "service": {
+    "uuid": "56784bb4-a416-4b4e-997e-0059973630b9",
+    "invariantUuid": "56783f9e-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": "ClientConfig",
+    "inputs": {
+
+    }
+  },
+  "vnfs": {
+
+  },
+  "networks": {
+
+  },
+  "collectionResource": {},
+  "configurations": {
+
+  },
+  "fabricConfigurations": {
+    "Fabric Configuration 0": {
+      "invariantUuid" : "1608eef4-de53-4334-a8d2-ba79cab4bddd",
+      "uuid": "88379cfd-fa0f-4946-8958-acc32640ceee",
+      "customizationUuid": "1e7f6512-c1cf-4b96-b5f5-b22a212ddad0",
+      "version": "3.0",
+      "name": "Fabric Configuration Object",
+      "description": "Fabric Configuration Object",
+      "type": "Configuration"
+    }
+  },
+  "serviceProxies": {
+
+  },
+  "vfModules": {
+
+  },
+  "volumeGroups": {
+
+  },
+  "pnfs": {
+
+  }
+}
index f9d4d06..317c046 100644 (file)
@@ -3,6 +3,7 @@
     "id": 8,
     "created": 1525075968000,
     "modified": 1525075971000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "5c2cd8e5-27d0-42e3-85a1-85db5eaba459",
     "templateId": "d42ba7c8-9e19-4e34-ae2c-d8af3f24498e",
     "userId": "16807000",
+    "aLaCarte": false,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d9c",
     "jobStatus": "FAILED",
     "statusModifiedDate": 1525075968000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-    "owningEntityName": "MetroPacketCore",
-    "project": "DFW",
+    "owningEntityName": "WayneHolland",
+    "project": "WATKINS",
     "aicZoneId": "NFT1",
     "aicZoneName": "NFTJSSSS-NFT1",
     "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
-    "tenantName": "AIN Web Tool-15-D-testgamma",
-    "regionId": "mtn6",
+    "tenantName": "AIN Web Tool-15-D-testalexandria",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "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
+    "createdBulkDate": 1525075968000,
+    "isRetryEnabled": true
   },
   {
     "id": 7,
     "created": 1525075968000,
     "modified": 1525075971000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "13063a83-924e-4500-a3a1-e53d1b58450b",
     "templateId": "d42ba7c8-9e19-4e34-ae2c-d8af3f24498e",
     "userId": "16807000",
+    "aLaCarte": false,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d9d",
     "jobStatus": "IN_PROGRESS",
     "statusModifiedDate": 1525075968000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-    "owningEntityName": "MetroPacketCore",
-    "project": "DFW",
+    "owningEntityName": "WayneHolland",
+    "project": "WATKINS",
     "aicZoneId": "NFT1",
     "aicZoneName": "NFTJSSSS-NFT1",
     "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
-    "tenantName": "AIN Web Tool-15-D-testgamma",
-    "regionId": "mtn6",
+    "tenantName": "AIN Web Tool-15-D-testalexandria",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "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
+    "createdBulkDate": 1525075968000,
+    "isRetryEnabled": false
   },
   {
     "id": 6,
     "created": 1525007432000,
     "modified": 1525007434000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
@@ -79,6 +88,8 @@
     "jobId": "e1db03c3-6274-4ff7-84cf-7bd3a3946de7",
     "templateId": "cad41760-8653-4c5a-a5fd-8ee34780ae69",
     "userId": "16807000",
+    "aLaCarte": false,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d8e",
     "jobStatus": "FAILED",
     "statusModifiedDate": 1525007432000,
     "hidden": false,
     "serviceModelId": "300adb1e-9b0c-4d52-bfb5-fa5393c4eabb",
     "serviceModelName": "AIM_TRANSPORT_00004",
     "serviceModelVersion": "1.0",
-    "createdBulkDate": 1525007432000
+    "createdBulkDate": 1525007432000,
+    "isRetryEnabled": false
   },
   {
     "id": 5,
     "created": 1524995555000,
     "modified": 1524995556000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "9f88fdb5-bb47-4bf3-8c5f-98f1ad0ec87c",
     "templateId": "ce4ec177-cfc8-483e-8a2c-b7aea53fd740",
     "userId": "16807000",
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d91",
+    "requestId": null,
     "jobStatus": "FAILED",
     "statusModifiedDate": 1524995555000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "aaa1",
     "owningEntityName": "aaa1",
-    "project": "DFW",
+    "project": "WATKINS",
     "aicZoneId": "BAN1",
     "aicZoneName": "VSDKYUTP-BAN1",
     "tenantId": "1178612d2b394be4834ad77f567c0af2",
     "tenantName": "AIN Web Tool-15-D-SSPtestcustome",
-    "regionId": "mtn6",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
     "serviceInstanceId": null,
     "serviceInstanceName": null,
     "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
     "serviceModelName": "ComplexService",
     "serviceModelVersion": "1.0",
-    "createdBulkDate": 1524995555000
+    "createdBulkDate": 1524995555000,
+    "isRetryEnabled": false
   },
   {
     "id": 4,
     "created": 1524994349000,
     "modified": 1524994350000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "b73b1543-fa12-4ad5-8ef5-49f02eb33698",
     "templateId": "79af00c6-4712-432a-8989-b6419c8baa40",
     "userId": "16807000",
+    "aLaCarte": true,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d94",
     "jobStatus": "FAILED",
     "statusModifiedDate": 1524994349000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "aaa1",
     "owningEntityName": "aaa1",
-    "project": "DFW",
+    "project": "WATKINS",
     "aicZoneId": null,
     "aicZoneName": null,
     "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
     "tenantName": "AIN Web Tool-15-D-STTest2",
-    "regionId": "mtn6",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
     "serviceInstanceId": null,
     "serviceInstanceName": null,
     "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
     "serviceModelName": "ComplexService",
     "serviceModelVersion": "1.0",
-    "createdBulkDate": 1524994349000
+    "createdBulkDate": 1524994349000,
+    "isRetryEnabled": false
   },
   {
     "id": 3,
     "created": 1524991828000,
     "modified": 1524991830000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "725ef127-4ee5-4665-bdf1-55ee342b362f",
     "templateId": "6bd53c0d-8742-43f6-9ed2-efbb87062779",
     "userId": "16807000",
+    "aLaCarte": true,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d96",
     "jobStatus": "FAILED",
     "statusModifiedDate": 1524991828000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "aaa1",
     "owningEntityName": "aaa1",
-    "project": "DFW",
+    "project": "WATKINS",
     "aicZoneId": "NFT1",
     "aicZoneName": "NFTJSSSS-NFT1",
     "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
     "tenantName": "USP-SIP-IC-24335-T-01",
-    "regionId": "AAIAIC25",
+    "regionId": "JANET25",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
     "serviceInstanceId": null,
     "serviceInstanceName": null,
     "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
     "serviceModelName": "ComplexService",
     "serviceModelVersion": "1.0",
-    "createdBulkDate": 1524991828000
+    "createdBulkDate": 1524991828000,
+    "isRetryEnabled": false
   },
   {
     "id": 2,
     "created": 1524663233000,
     "modified": 1524663236000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "b1ff271b-829a-43f9-a2e3-23987a34f261",
     "templateId": "262fccc5-cae9-4258-b522-540c4010e0a9",
     "userId": "16807000",
+    "aLaCarte": true,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d98",
     "jobStatus": "FAILED",
     "statusModifiedDate": 1524663233000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-    "owningEntityName": "MetroPacketCore",
-    "project": "DFW",
+    "owningEntityName": "WayneHolland",
+    "project": "WATKINS",
     "aicZoneId": "NFT1",
     "aicZoneName": "NFTJSSSS-NFT1",
     "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
-    "tenantName": "AIN Web Tool-15-D-testgamma",
-    "regionId": "mtn6",
+    "tenantName": "AIN Web Tool-15-D-testalexandria",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "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
+    "createdBulkDate": 1524663233000,
+    "isRetryEnabled": true
   },
   {
     "id": 1,
     "created": 1524663233000,
     "modified": 1524663236000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "850dc7d2-5240-437f-9bcd-b1ed7dc339ca",
     "templateId": "262fccc5-cae9-4258-b522-540c4010e0a9",
     "userId": "16807000",
+    "aLaCarte": true,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d45",
     "jobStatus": "IN_PROGRESS",
     "statusModifiedDate": 1524663233000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-    "owningEntityName": "MetroPacketCore",
-    "project": "DFW",
+    "owningEntityName": "WayneHolland",
+    "project": "WATKINS",
     "aicZoneId": "NFT1",
     "aicZoneName": "NFTJSSSS-NFT1",
     "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
-    "tenantName": "AIN Web Tool-15-D-testgamma",
-    "regionId": "mtn6",
+    "tenantName": "AIN Web Tool-15-D-testalexandria",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "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
-  }
+    "createdBulkDate": 1524663233000,
+    "isRetryEnabled": false
+  },
+  {
+  "id": 9,
+  "created": 1524663233000,
+  "modified": 1524663236000,
+  "action": "DELETE",
+  "createdId": null,
+  "modifiedId": null,
+  "rowNum": null,
+  "auditUserId": null,
+  "auditTrail": null,
+  "jobId": "850dc7d2-5240-437f-9bcd-b1ed7dc339c2",
+  "templateId": "262fccc5-cae9-4258-b522-540c4010e0a9",
+  "userId": "16807000",
+  "aLaCarte": true,
+  "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d45",
+  "jobStatus": "IN_PROGRESS",
+  "statusModifiedDate": 1524663233000,
+  "hidden": false,
+  "pause": false,
+  "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+  "owningEntityName": "WayneHolland",
+  "project": "WATKINS",
+  "aicZoneId": "NFT1",
+  "aicZoneName": "NFTJSSSS-NFT1",
+  "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+  "tenantName": "AIN Web Tool-15-D-testalexandria",
+  "regionId": "hvf6",
+  "regionName": null,
+  "serviceType": "TYLER SILVIA",
+  "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,
+  "isRetryEnabled": false
+},
+  {
+  "id": 10,
+  "created": 1524663233000,
+  "modified": 1524663236000,
+  "action": "UPDATE",
+  "createdId": null,
+  "modifiedId": null,
+  "rowNum": null,
+  "auditUserId": null,
+  "auditTrail": null,
+  "jobId": "850dc7d2-5240-437f-9bcd-b1ed7dc339c1",
+  "templateId": "262fccc5-cae9-4258-b522-540c4010e0a9",
+  "userId": "16807000",
+  "aLaCarte": true,
+  "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d45",
+  "jobStatus": "COMPLETED",
+  "statusModifiedDate": 1524663233000,
+  "hidden": false,
+  "pause": false,
+  "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+  "owningEntityName": "WayneHolland",
+  "project": "WATKINS",
+  "aicZoneId": "NFT1",
+  "aicZoneName": "NFTJSSSS-NFT1",
+  "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+  "tenantName": "AIN Web Tool-15-D-testalexandria",
+  "regionId": "hvf6",
+  "regionName": null,
+  "serviceType": "TYLER SILVIA",
+  "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
+}
 ]
index f9d4d06..744013a 100644 (file)
@@ -3,6 +3,7 @@
     "id": 8,
     "created": 1525075968000,
     "modified": 1525075971000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "5c2cd8e5-27d0-42e3-85a1-85db5eaba459",
     "templateId": "d42ba7c8-9e19-4e34-ae2c-d8af3f24498e",
     "userId": "16807000",
+    "aLaCarte": false,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d9c",
     "jobStatus": "FAILED",
     "statusModifiedDate": 1525075968000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-    "owningEntityName": "MetroPacketCore",
-    "project": "DFW",
+    "owningEntityName": "WayneHolland",
+    "project": "WATKINS",
     "aicZoneId": "NFT1",
     "aicZoneName": "NFTJSSSS-NFT1",
     "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
-    "tenantName": "AIN Web Tool-15-D-testgamma",
-    "regionId": "mtn6",
+    "tenantName": "AIN Web Tool-15-D-testalexandria",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
     "serviceInstanceId": null,
     "serviceInstanceName": "nWUfl instance name_002",
@@ -37,6 +40,7 @@
     "id": 7,
     "created": 1525075968000,
     "modified": 1525075971000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "13063a83-924e-4500-a3a1-e53d1b58450b",
     "templateId": "d42ba7c8-9e19-4e34-ae2c-d8af3f24498e",
     "userId": "16807000",
+    "aLaCarte": false,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d9d",
     "jobStatus": "IN_PROGRESS",
     "statusModifiedDate": 1525075968000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-    "owningEntityName": "MetroPacketCore",
-    "project": "DFW",
+    "owningEntityName": "WayneHolland",
+    "project": "WATKINS",
     "aicZoneId": "NFT1",
     "aicZoneName": "NFTJSSSS-NFT1",
     "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
-    "tenantName": "AIN Web Tool-15-D-testgamma",
-    "regionId": "mtn6",
+    "tenantName": "AIN Web Tool-15-D-testalexandria",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
     "serviceInstanceId": null,
     "serviceInstanceName": "nWUfl instance name_001",
@@ -71,6 +77,7 @@
     "id": 6,
     "created": 1525007432000,
     "modified": 1525007434000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
@@ -79,6 +86,8 @@
     "jobId": "e1db03c3-6274-4ff7-84cf-7bd3a3946de7",
     "templateId": "cad41760-8653-4c5a-a5fd-8ee34780ae69",
     "userId": "16807000",
+    "aLaCarte": false,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d8e",
     "jobStatus": "FAILED",
     "statusModifiedDate": 1525007432000,
     "hidden": false,
     "id": 5,
     "created": 1524995555000,
     "modified": 1524995556000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "9f88fdb5-bb47-4bf3-8c5f-98f1ad0ec87c",
     "templateId": "ce4ec177-cfc8-483e-8a2c-b7aea53fd740",
     "userId": "16807000",
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d91",
+    "requestId": null,
     "jobStatus": "FAILED",
     "statusModifiedDate": 1524995555000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "aaa1",
     "owningEntityName": "aaa1",
-    "project": "DFW",
+    "project": "WATKINS",
     "aicZoneId": "BAN1",
     "aicZoneName": "VSDKYUTP-BAN1",
     "tenantId": "1178612d2b394be4834ad77f567c0af2",
     "tenantName": "AIN Web Tool-15-D-SSPtestcustome",
-    "regionId": "mtn6",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
     "serviceInstanceId": null,
     "serviceInstanceName": null,
     "id": 4,
     "created": 1524994349000,
     "modified": 1524994350000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "b73b1543-fa12-4ad5-8ef5-49f02eb33698",
     "templateId": "79af00c6-4712-432a-8989-b6419c8baa40",
     "userId": "16807000",
+    "aLaCarte": true,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d94",
     "jobStatus": "FAILED",
     "statusModifiedDate": 1524994349000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "aaa1",
     "owningEntityName": "aaa1",
-    "project": "DFW",
+    "project": "WATKINS",
     "aicZoneId": null,
     "aicZoneName": null,
     "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
     "tenantName": "AIN Web Tool-15-D-STTest2",
-    "regionId": "mtn6",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
     "serviceInstanceId": null,
     "serviceInstanceName": null,
     "id": 3,
     "created": 1524991828000,
     "modified": 1524991830000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "725ef127-4ee5-4665-bdf1-55ee342b362f",
     "templateId": "6bd53c0d-8742-43f6-9ed2-efbb87062779",
     "userId": "16807000",
+    "aLaCarte": true,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d96",
     "jobStatus": "FAILED",
     "statusModifiedDate": 1524991828000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "aaa1",
     "owningEntityName": "aaa1",
-    "project": "DFW",
+    "project": "WATKINS",
     "aicZoneId": "NFT1",
     "aicZoneName": "NFTJSSSS-NFT1",
     "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
     "tenantName": "USP-SIP-IC-24335-T-01",
-    "regionId": "AAIAIC25",
+    "regionId": "JANET25",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
     "serviceInstanceId": null,
     "serviceInstanceName": null,
     "id": 2,
     "created": 1524663233000,
     "modified": 1524663236000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "b1ff271b-829a-43f9-a2e3-23987a34f261",
     "templateId": "262fccc5-cae9-4258-b522-540c4010e0a9",
     "userId": "16807000",
+    "aLaCarte": true,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d98",
     "jobStatus": "FAILED",
     "statusModifiedDate": 1524663233000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-    "owningEntityName": "MetroPacketCore",
-    "project": "DFW",
+    "owningEntityName": "WayneHolland",
+    "project": "WATKINS",
     "aicZoneId": "NFT1",
     "aicZoneName": "NFTJSSSS-NFT1",
     "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
-    "tenantName": "AIN Web Tool-15-D-testgamma",
-    "regionId": "mtn6",
+    "tenantName": "AIN Web Tool-15-D-testalexandria",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
     "serviceInstanceId": null,
     "serviceInstanceName": "sPenLiZXXpqzsVck instance name_02",
     "id": 1,
     "created": 1524663233000,
     "modified": 1524663236000,
+    "action": "INSTANTIATE",
     "createdId": null,
     "modifiedId": null,
     "rowNum": null,
     "jobId": "850dc7d2-5240-437f-9bcd-b1ed7dc339ca",
     "templateId": "262fccc5-cae9-4258-b522-540c4010e0a9",
     "userId": "16807000",
+    "aLaCarte": true,
+    "msoRequestId": "c0011670-0e1a-4b74-945d-8bf5aede1d45",
     "jobStatus": "IN_PROGRESS",
     "statusModifiedDate": 1524663233000,
     "hidden": false,
     "pause": false,
     "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-    "owningEntityName": "MetroPacketCore",
-    "project": "DFW",
+    "owningEntityName": "WayneHolland",
+    "project": "WATKINS",
     "aicZoneId": "NFT1",
     "aicZoneName": "NFTJSSSS-NFT1",
     "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
-    "tenantName": "AIN Web Tool-15-D-testgamma",
-    "regionId": "mtn6",
+    "tenantName": "AIN Web Tool-15-D-testalexandria",
+    "regionId": "hvf6",
     "regionName": null,
-    "serviceType": "VIRTUAL USP",
+    "serviceType": "TYLER SILVIA",
     "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
     "serviceInstanceId": null,
     "serviceInstanceName": "sPenLiZXXpqzsVck instance name_01",
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicFabricConfigService.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicFabricConfigService.json
new file mode 100644 (file)
index 0000000..46989e1
--- /dev/null
@@ -0,0 +1,51 @@
+{
+  "service": {
+    "uuid": "12344bb4-a416-4b4e-997e-0059973630b9",
+    "invariantUuid": "12343f9e-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": "ClientConfig",
+    "inputs": {
+
+    }
+  },
+  "vnfs": {
+
+  },
+  "networks": {
+
+  },
+  "collectionResource": {},
+  "configurations": {
+
+  },
+  "fabricConfigurations": {
+    "Fabric Configuration 0": {
+      "invariantUuid" : "1608eef4-de53-4334-a8d2-ba79cab4bddd",
+      "uuid": "88379cfd-fa0f-4946-8958-acc32640ceee",
+      "customizationUuid": "1e7f6512-c1cf-4b96-b5f5-b22a212ddad0",
+      "version": "3.0",
+      "name": "Fabric Configuration Object",
+      "description": "Fabric Configuration Object",
+      "type": "Configuration"
+    }
+  },
+  "serviceProxies": {
+
+  },
+  "vfModules": {
+
+  },
+  "volumeGroups": {
+
+  },
+  "pnfs": {
+
+  }
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicNetworkInstance.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicNetworkInstance.json
new file mode 100644 (file)
index 0000000..3f85c89
--- /dev/null
@@ -0,0 +1,73 @@
+{
+  "networks": {
+    "ExtVL 0": {
+      "rollbackOnFailure": "false",
+      "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+      "lcpCloudRegionId": "hvf6",
+      "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+      "lineOfBusiness": "zzz1",
+      "platformName": "platform",
+      "originalName": "ExtVL 0",
+      "modelInfo": {
+        "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+        "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+        "modelName": "ExtVL",
+        "modelVersion": "37.0",
+        "modelType": "network",
+        "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+        "modelCustomizationName": "ExtVL 0"
+      },
+      "instanceName": "ExtVL 0",
+      "instanceId": "NETWORK_INSTANCE_ID",
+      "action": "None"
+    }
+  },
+  "vnfs": {},
+  "instanceParams": [
+    {
+      "2017488_adiodvpe0_ASN": "AV_vPE"
+    }
+  ],
+  "validationCounter": 0,
+  "existingNames": {
+    "123": "",
+    "instancename": "",
+    "yoav": ""
+  },
+  "existingVNFCounterMap": {},
+  "existingNetworksCounterMap": {},
+  "instanceName": "InstanceName",
+  "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+  "subscriptionServiceType": "TYLER SILVIA",
+  "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+  "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+  "lcpCloudRegionId": "JANET25",
+  "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+  "aicZoneId": "JAG1",
+  "projectName": "WATKINS",
+  "rollbackOnFailure": "true",
+  "aicZoneName": "YUDFJULP-JAG1",
+  "owningEntityName": "WayneHolland",
+  "testApi": "GR_API",
+  "tenantName": "USP-SIP-IC-24335-T-01",
+  "bulkSize": 1,
+  "modelInfo": {
+    "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+    "modelName": "action-data",
+    "modelVersion": "1.0",
+    "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+  },
+  "isALaCarte": true,
+  "name": "action-data",
+  "version": "1.0",
+  "description": "",
+  "category": "",
+  "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+  "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+  "serviceType": "",
+  "serviceRole": "",
+  "isMultiStepDesign": false,
+  "instanceId": "f8791436-8d55-4fde-b4d5-72dd2cf13cfb",
+  "action": "None"
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicNetworkModel.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicNetworkModel.json
new file mode 100644 (file)
index 0000000..cd411fe
--- /dev/null
@@ -0,0 +1,56 @@
+{
+  "service": {
+    "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+    "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "name": "action-data",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "",
+    "serviceType": "",
+    "serviceRole": "",
+    "description": "",
+    "serviceEcompNaming": "false",
+    "instantiationType": "A-La-Carte",
+    "inputs": {
+      "2017488_adiodvpe0_ASN": {
+        "type": "string",
+        "description": "AV/PE",
+        "entry_schema": null,
+        "inputProperties": null,
+        "constraints": [],
+        "required": true,
+        "default": "AV_vPE"
+      }
+    }
+  },
+  "vnfs": {},
+  "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": {
+        "min_instances": 1,
+        "max_instances": 10,
+        "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": {},
+  "fabricConfigurations": {},
+  "serviceProxies": {},
+  "vfModules": {},
+  "volumeGroups": {},
+  "pnfs": {}
+}
index 714b3a4..858d093 100644 (file)
               "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",
+              "vmx_int_ctl_prefix": "10.0.0.10",
               "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",
+              "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
               "is_AVPN_service": "false",
               "vmx_RSG_name": "vREXI-affinity",
               "vmx_int_ctl_forwarding": "l2",
-              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvre_oam_ip_0": "10.0.0.10",
               "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
               "vmxvpfe_sriov41_0_port_vlanstrip": "false",
               "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
@@ -84,7 +84,7 @@
               "vf_module_id": "123",
               "nf_function": "JAI",
               "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
-              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "vmxvre_int_ctl_ip_0": "10.0.0.10",
               "ecomp_generated_naming": "true",
               "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
               "vnf_name": "mtnj309me6vre",
               "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_oam_gateway": "10.0.0.10",
               "vmxvre_volume_name_1": "vREXI_FAVolume",
               "vmxvre_ore_present": "0",
               "vmxvre_volume_name_0": "vREXI_FBVolume",
               "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",
+              "vmx_int_ctl_prefix": "10.0.0.10",
               "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",
+              "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
               "is_AVPN_service": "false",
               "vmx_RSG_name": "vREXI-affinity",
               "vmx_int_ctl_forwarding": "l2",
-              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvre_oam_ip_0": "10.0.0.10",
               "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
               "vmxvpfe_sriov41_0_port_vlanstrip": "false",
               "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
               "vf_module_id": "123",
               "nf_function": "JAI",
               "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
-              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "vmxvre_int_ctl_ip_0": "10.0.0.10",
               "ecomp_generated_naming": "true",
               "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
               "vnf_name": "mtnj309me6vre",
               "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_oam_gateway": "10.0.0.10",
               "vmxvre_volume_name_1": "vREXI_FAVolume",
               "vmxvre_ore_present": "0",
               "vmxvre_volume_name_0": "vREXI_FBVolume",
               "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",
+              "vmx_int_ctl_prefix": "10.0.0.10",
               "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",
+              "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
               "is_AVPN_service": "false",
               "vmx_RSG_name": "vREXI-affinity",
               "vmx_int_ctl_forwarding": "l2",
-              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvre_oam_ip_0": "10.0.0.10",
               "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
               "vmxvpfe_sriov41_0_port_vlanstrip": "false",
               "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
               "vf_module_id": "123",
               "nf_function": "JAI",
               "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
-              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "vmxvre_int_ctl_ip_0": "10.0.0.10",
               "ecomp_generated_naming": "true",
               "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
               "vnf_name": "mtnj309me6vre",
               "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_oam_gateway": "10.0.0.10",
               "vmxvre_volume_name_1": "vREXI_FAVolume",
               "vmxvre_ore_present": "0",
               "vmxvre_volume_name_0": "vREXI_FBVolume",
     "lcpRegionsAndTenants": {
       "lcpRegionList": [
         {
-          "id": "AAIAIC25",
-          "name": "AAIAIC25",
+          "id": "JANET25",
+          "name": "JANET25 (AIC)",
           "isPermitted": true
         },
         {
-          "id": "mtn6",
-          "name": "mtn6",
+          "id": "hvf6",
+          "name": "hvf6 (AIC)",
           "isPermitted": true
         }
       ],
       "lcpRegionsTenantsMap": {
-        "AAIAIC25": [
+        "JANET25": [
           {
             "id": "092eb9e8e4b7412e8787dd091bc58e86",
             "name": "USP-SIP-IC-24335-T-01",
             "isPermitted": true
           }
         ],
-        "mtn6": [
+        "hvf6": [
           {
             "id": "bae71557c5bb4d5aac6743a4e5f1d054",
-            "name": "AIN Web Tool-15-D-testgamma",
+            "name": "AIN Web Tool-15-D-testalexandria",
             "isPermitted": true
           },
           {
           },
           {
             "id": "d0a3e3f2964542259d155a81c41aadc3",
-            "name": "test-mtn6-09",
+            "name": "test-hvf6-09",
             "isPermitted": true
           },
           {
     "subscribers": [
       {
         "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
-        "name": "Mobility",
+        "name": "Emanuel",
         "isPermitted": false
       },
       {
         "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc",
-        "name": "PACKET CORE",
+        "name": "JULIO ERICKSON",
         "isPermitted": false
       },
       {
         "id": "e433710f-9217-458d-a79d-1c7aff376d89",
-        "name": "USP VOICE",
+        "name": "SILVIA ROBBINS",
         "isPermitted": true
       }
     ],
     "productFamilies": [
       {
         "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
-        "name": "DHV",
+        "name": "SCOTTIE",
         "isPermitted": true
       },
       {
         "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
-        "name": "FLEXREACH",
+        "name": "IGNACIO",
         "isPermitted": true
       },
       {
         "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
-        "name": "Netbond",
+        "name": "Christie",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "vRRaaS",
-        "name": "vRRaaS",
+        "id": "vTerrance",
+        "name": "vTerrance",
         "isPermitted": true
       },
       {
       },
       {
         "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
-        "name": "Mobility",
+        "name": "Emanuel",
         "isPermitted": true
       },
       {
       },
       {
         "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
-        "name": "FIRSTNET",
+        "name": "LINDSEY",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "vHNGWaas",
+        "id": "vRosemarie",
         "name": "HNGATEWAY",
         "isPermitted": true
       },
       {
         "id": "vHNPaas",
-        "name": "HNPORTAL",
+        "name": "WILKINS",
         "isPermitted": true
       },
       {
         "id": "e433710f-9217-458d-a79d-1c7aff376d89",
-        "name": "VIRTUAL USP",
+        "name": "TYLER SILVIA",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "VIPRaaS",
-        "name": "vIPRaaS",
+        "id": "Cisneros",
+        "name": "vMuriel",
         "isPermitted": true
       },
       {
         "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
-        "name": "WAN Bonding",
+        "name": "CARA Griffin",
         "isPermitted": true
       },
       {
         "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
-        "name": "HOSTED COMMUNICATIONS",
+        "name": "DARREN MCGEE",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "vVIGaaS",
-        "name": "vVIGaaS",
+        "id": "vSalvatore",
+        "name": "vSalvatore",
         "isPermitted": true
       },
       {
         "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
-        "name": "uCPE-VMS",
+        "name": "Josefina",
         "isPermitted": true
       },
       {
-        "id": "vPEaaS",
-        "name": "vPEaaS",
+        "id": "vHubbard",
+        "name": "vHubbard",
         "isPermitted": true
       },
       {
         "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
-        "name": "HOSTED COMMUNICATIONS",
+        "name": "DARREN MCGEE",
         "isPermitted": true
       }
     ],
       "e433710f-9217-458d-a79d-1c7aff376d89": [
         {
           "id": "0",
-          "name": "vFlowLogic",
+          "name": "vRichardson",
           "isPermitted": false
         },
         {
           "id": "1",
-          "name": "VIRTUAL USP",
+          "name": "TYLER SILVIA",
           "isPermitted": true
         },
         {
           "id": "2",
-          "name": "Mobility",
+          "name": "Emanuel",
           "isPermitted": false
         },
         {
           "id": "3",
-          "name": "vBNG",
+          "name": "vJamie",
           "isPermitted": false
         },
         {
         },
         {
           "id": "5",
-          "name": "Nimbus",
+          "name": "Kennedy",
           "isPermitted": false
         },
         {
         },
         {
           "id": "16",
-          "name": "FIRSTNET",
+          "name": "LINDSEY",
           "isPermitted": false
         },
         {
           "id": "17",
-          "name": "ACTIVE_CHARGE",
+          "name": "JOHANNA_SANTOS",
           "isPermitted": false
         },
         {
           "id": "18",
-          "name": "vHSS",
+          "name": "vCarroll",
           "isPermitted": false
         }
       ]
         },
         {
           "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-          "name": "MetroPacketCore"
+          "name": "WayneHolland"
         },
         {
-          "id": "Wireline",
-          "name": "Wireline"
+          "id": "Melissa",
+          "name": "Melissa"
         }
       ],
       "projectList": [
         {
-          "id": "DFW",
-          "name": "DFW"
+          "id": "WATKINS",
+          "name": "WATKINS"
         },
         {
           "id": "x1",
       ],
       "lineOfBusinessList": [
         {
-          "id": "ECOMP",
-          "name": "ECOMP"
+          "id": "ONAP",
+          "name": "ONAP"
         },
         {
           "id": "zzz1",
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/Dror_service1806_Macro1.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/Dror_service1806_Macro1.json
new file mode 100644 (file)
index 0000000..4a0dc24
--- /dev/null
@@ -0,0 +1,192 @@
+{
+  "service": {
+    "uuid": "74fa72dd-012b-49c3-800d-06b12bcaf1a0",
+    "invariantUuid": "bceeaff9-5716-42bf-8fa1-8c6f720cf61d",
+    "name": "Dror_service1806_Macro1",
+    "version": "2.0",
+    "toscaModelURL": null,
+    "category": "Emanuel",
+    "serviceType": "b",
+    "serviceRole": "c",
+    "description": "test",
+    "serviceEcompNaming": "false",
+    "instantiationType": "Macro",
+    "inputs": {}
+  },
+  "vnfs": {
+    "092017_VSP_GINGERby11 0": {
+      "uuid": "1ecfa5f1-78c5-41f6-ad34-753ca1fcdc5d",
+      "invariantUuid": "e88d6582-b7e5-4dc6-ac9c-6f7130727a92",
+      "description": "092017_VSP_GINGERby11",
+      "name": "092017_VSP_GINGERby11",
+      "version": "1.0",
+      "customizationUuid": "cc40295f-a834-4f42-b634-32fff9d6489b",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "nf_naming": "{ecomp_generated_naming=true}",
+        "mmn_volume_name_4": "misc-mn-v-vde",
+        "multi_stage_design": "false",
+        "mmn_volume_size_1": "20.0",
+        "mmn_volume_name_1": "data-mn-v-vdb",
+        "availability_zone_max_count": "1",
+        "mmn_volume_name_3": "backup-mn-v-vdd",
+        "mmn_volume_name_2": "arch-mn-v-vdc",
+        "ecomp_generated_naming": "true",
+        "mmn_volume_size_2": "20.0",
+        "mmn_volume_size_3": "50.0",
+        "mmn_volume_size_4": "20.0"
+      },
+      "type": "VF",
+      "modelCustomizationName": "092017_VSP_GINGERby11 0",
+      "vfModules": {
+        "092017_vsp_gingerby110..092017VspGingerby11..pxmc_vmt..module-1": {
+          "uuid": "96af1531-35b5-44b8-b8e9-17e400cce6fd",
+          "invariantUuid": "be556344-d212-4c88-9fe1-c72003591e78",
+          "customizationUuid": "abb15cf7-174a-4815-86e8-91997b1f07b7",
+          "description": null,
+          "name": "092017VspGingerby11..pxmc_vmt..module-1",
+          "version": "1",
+          "modelCustomizationName": "092017VspGingerby11..pxmc_vmt..module-1",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "pxmc_vmt"
+          },
+          "inputs": {},
+          "volumeGroupAllowed": false
+        },
+        "092017_vsp_gingerby110..092017VspGingerby11..pxmc_mmn..module-2": {
+          "uuid": "2d8bf918-ad4b-42f6-b87d-8cb5c13660b6",
+          "invariantUuid": "19c5c400-9d33-4e69-a0ef-9a26ebe68b3d",
+          "customizationUuid": "6268df2d-74cc-4189-b7b5-7f833b54d457",
+          "description": null,
+          "name": "092017VspGingerby11..pxmc_mmn..module-2",
+          "version": "1",
+          "modelCustomizationName": "092017VspGingerby11..pxmc_mmn..module-2",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "pxmc_mmn"
+          },
+          "inputs": {},
+          "volumeGroupAllowed": true
+        },
+        "092017_vsp_gingerby110..092017VspGingerby11..pxmc_base..module-0": {
+          "uuid": "a3d8289d-7b29-4e0f-8b51-e825bfe54749",
+          "invariantUuid": "dea04dc1-f4fb-435d-80b4-f176d4c15653",
+          "customizationUuid": "e6e4a00e-3fde-459c-9a68-4bf2b35d5e9e",
+          "description": null,
+          "name": "092017VspGingerby11..pxmc_base..module-0",
+          "version": "1",
+          "modelCustomizationName": "092017VspGingerby11..pxmc_base..module-0",
+          "properties": {
+            "minCountInstances": 1,
+            "maxCountInstances": 1,
+            "initialCount": 1,
+            "vfModuleLabel": "pxmc_base"
+          },
+          "inputs": {},
+          "volumeGroupAllowed": false
+        }
+      },
+      "volumeGroups": {
+        "092017_vsp_gingerby110..092017VspGingerby11..pxmc_mmn..module-2": {
+          "uuid": "2d8bf918-ad4b-42f6-b87d-8cb5c13660b6",
+          "invariantUuid": "19c5c400-9d33-4e69-a0ef-9a26ebe68b3d",
+          "customizationUuid": "6268df2d-74cc-4189-b7b5-7f833b54d457",
+          "description": null,
+          "name": "092017VspGingerby11..pxmc_mmn..module-2",
+          "version": "1",
+          "modelCustomizationName": "092017VspGingerby11..pxmc_mmn..module-2",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "pxmc_mmn"
+          },
+          "inputs": {}
+        }
+      },
+      "vfcInstanceGroups": {}
+    }
+  },
+  "networks": {},
+  "collectionResource": {},
+  "configurations": {},
+  "serviceProxies": {},
+  "vfModules": {
+    "092017_vsp_gingerby110..092017VspGingerby11..pxmc_vmt..module-1": {
+      "uuid": "96af1531-35b5-44b8-b8e9-17e400cce6fd",
+      "invariantUuid": "be556344-d212-4c88-9fe1-c72003591e78",
+      "customizationUuid": "abb15cf7-174a-4815-86e8-91997b1f07b7",
+      "description": null,
+      "name": "092017VspGingerby11..pxmc_vmt..module-1",
+      "version": "1",
+      "modelCustomizationName": "092017VspGingerby11..pxmc_vmt..module-1",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "pxmc_vmt"
+      },
+      "inputs": {},
+      "volumeGroupAllowed": false
+    },
+    "092017_vsp_gingerby110..092017VspGingerby11..pxmc_base..module-0": {
+      "uuid": "a3d8289d-7b29-4e0f-8b51-e825bfe54749",
+      "invariantUuid": "dea04dc1-f4fb-435d-80b4-f176d4c15653",
+      "customizationUuid": "e6e4a00e-3fde-459c-9a68-4bf2b35d5e9e",
+      "description": null,
+      "name": "092017VspGingerby11..pxmc_base..module-0",
+      "version": "1",
+      "modelCustomizationName": "092017VspGingerby11..pxmc_base..module-0",
+      "properties": {
+        "minCountInstances": 1,
+        "maxCountInstances": 1,
+        "initialCount": 1,
+        "vfModuleLabel": "pxmc_base"
+      },
+      "inputs": {},
+      "volumeGroupAllowed": false
+    },
+    "092017_vsp_gingerby110..092017VspGingerby11..pxmc_mmn..module-2": {
+      "uuid": "2d8bf918-ad4b-42f6-b87d-8cb5c13660b6",
+      "invariantUuid": "19c5c400-9d33-4e69-a0ef-9a26ebe68b3d",
+      "customizationUuid": "6268df2d-74cc-4189-b7b5-7f833b54d457",
+      "description": null,
+      "name": "092017VspGingerby11..pxmc_mmn..module-2",
+      "version": "1",
+      "modelCustomizationName": "092017VspGingerby11..pxmc_mmn..module-2",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "pxmc_mmn"
+      },
+      "inputs": {},
+      "volumeGroupAllowed": true
+    }
+  },
+  "volumeGroups": {
+    "092017_vsp_gingerby110..092017VspGingerby11..pxmc_mmn..module-2": {
+      "uuid": "2d8bf918-ad4b-42f6-b87d-8cb5c13660b6",
+      "invariantUuid": "19c5c400-9d33-4e69-a0ef-9a26ebe68b3d",
+      "customizationUuid": "6268df2d-74cc-4189-b7b5-7f833b54d457",
+      "description": null,
+      "name": "092017VspGingerby11..pxmc_mmn..module-2",
+      "version": "1",
+      "modelCustomizationName": "092017VspGingerby11..pxmc_mmn..module-2",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "pxmc_mmn"
+      },
+      "inputs": {}
+    }
+  },
+  "pnfs": {}
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/Dror_service1806_Macro_NW.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/Dror_service1806_Macro_NW.json
new file mode 100644 (file)
index 0000000..fe7efe3
--- /dev/null
@@ -0,0 +1,143 @@
+{
+  "service": {
+    "uuid": "bd8ffd14-da36-4f62-813c-6716ba9f4354",
+    "invariantUuid": "b1f489c0-2aa0-47e1-ba6c-98658d6945bf",
+    "name": "Dror_service1806_Macro_NW",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "Emanuel",
+    "serviceType": "cc",
+    "serviceRole": "ccc",
+    "description": "test",
+    "serviceEcompNaming": "true",
+    "instantiationType": "Macro",
+    "inputs": {}
+  },
+  "vnfs": {
+    "2016-233_XSP_bfsa_nin2 0": {
+      "uuid": "327138f7-0608-4774-bb2c-959332a18399",
+      "invariantUuid": "74dc0354-a178-43ee-91f2-ec1f288cd50d",
+      "description": "VSP for XSP after network recreated",
+      "name": "2016-233_XSP_bfsa_nin2",
+      "version": "1.0",
+      "customizationUuid": "643b38b5-b75b-4506-8be5-55595ca2cbef",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "xsa_PF_DMZ_security_group": "default",
+        "nf_naming": "{ecomp_generated_naming=true}",
+        "multi_stage_design": "false",
+        "availability_zone_max_count": "1",
+        "xsa_IF_DMZ_security_group": "default",
+        "xsa_image_name": "E-IPFR_XSP_R21.qcow2",
+        "ecomp_generated_naming": "true",
+        "vnf_name": "bfsa0007v",
+        "xsa_cinder_volume_size_0": "300",
+        "xsa_flavor_name": "nd.c4r8d0",
+        "xsa_cinder_volume_size_1": "300",
+        "xsa_NSDNet_net_security_group": "default"
+      },
+      "type": "VF",
+      "modelCustomizationName": "2016-233_XSP_bfsa_nin2 0",
+      "vfModules": {
+        "2016233_xsp_bfsa_nin20..2016233XspBfsaNin2..base_bwks_xspa..module-0": {
+          "uuid": "52d5a1a1-ada5-49b6-864c-8405af43b6b4",
+          "invariantUuid": "dfb65a6b-d5ba-4142-bbee-b83eda3902d6",
+          "customizationUuid": "d9d146cc-48c1-43fb-a6ef-927c75eaa4ab",
+          "description": null,
+          "name": "2016233XspBfsaNin2..base_bwks_xspa..module-0",
+          "version": "1",
+          "modelCustomizationName": "2016233XspBfsaNin2..base_bwks_xspa..module-0",
+          "properties": {
+            "minCountInstances": 1,
+            "maxCountInstances": 1,
+            "initialCount": 1,
+            "vfModuleLabel": "base_bwks_xspa"
+          },
+          "inputs": {},
+          "volumeGroupAllowed": true
+        }
+      },
+      "volumeGroups": {
+        "2016233_xsp_bfsa_nin20..2016233XspBfsaNin2..base_bwks_xspa..module-0": {
+          "uuid": "52d5a1a1-ada5-49b6-864c-8405af43b6b4",
+          "invariantUuid": "dfb65a6b-d5ba-4142-bbee-b83eda3902d6",
+          "customizationUuid": "d9d146cc-48c1-43fb-a6ef-927c75eaa4ab",
+          "description": null,
+          "name": "2016233XspBfsaNin2..base_bwks_xspa..module-0",
+          "version": "1",
+          "modelCustomizationName": "2016233XspBfsaNin2..base_bwks_xspa..module-0",
+          "properties": {
+            "minCountInstances": 1,
+            "maxCountInstances": 1,
+            "initialCount": 1,
+            "vfModuleLabel": "base_bwks_xspa"
+          },
+          "inputs": {}
+        }
+      },
+      "vfcInstanceGroups": {}
+    }
+  },
+  "networks": {
+    "ExtVL 0": {
+      "uuid": "40083c20-b1ab-449a-8f6d-f75406c497ac",
+      "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": "40.0",
+      "customizationUuid": "14ef5a8f-55db-411b-a64c-40c200073f1f",
+      "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": {},
+  "serviceProxies": {},
+  "vfModules": {
+    "2016233_xsp_bfsa_nin20..2016233XspBfsaNin2..base_bwks_xspa..module-0": {
+      "uuid": "52d5a1a1-ada5-49b6-864c-8405af43b6b4",
+      "invariantUuid": "dfb65a6b-d5ba-4142-bbee-b83eda3902d6",
+      "customizationUuid": "d9d146cc-48c1-43fb-a6ef-927c75eaa4ab",
+      "description": null,
+      "name": "2016233XspBfsaNin2..base_bwks_xspa..module-0",
+      "version": "1",
+      "modelCustomizationName": "2016233XspBfsaNin2..base_bwks_xspa..module-0",
+      "properties": {
+        "minCountInstances": 1,
+        "maxCountInstances": 1,
+        "initialCount": 1,
+        "vfModuleLabel": "base_bwks_xspa"
+      },
+      "inputs": {},
+      "volumeGroupAllowed": true
+    }
+  },
+  "volumeGroups": {
+    "2016233_xsp_bfsa_nin20..2016233XspBfsaNin2..base_bwks_xspa..module-0": {
+      "uuid": "52d5a1a1-ada5-49b6-864c-8405af43b6b4",
+      "invariantUuid": "dfb65a6b-d5ba-4142-bbee-b83eda3902d6",
+      "customizationUuid": "d9d146cc-48c1-43fb-a6ef-927c75eaa4ab",
+      "description": null,
+      "name": "2016233XspBfsaNin2..base_bwks_xspa..module-0",
+      "version": "1",
+      "modelCustomizationName": "2016233XspBfsaNin2..base_bwks_xspa..module-0",
+      "properties": {
+        "minCountInstances": 1,
+        "maxCountInstances": 1,
+        "initialCount": 1,
+        "vfModuleLabel": "base_bwks_xspa"
+      },
+      "inputs": {}
+    }
+  },
+  "pnfs": {}
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/list-services.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/list-services.json
new file mode 100644 (file)
index 0000000..daa413d
--- /dev/null
@@ -0,0 +1,47 @@
+{
+  "services": [
+    {
+      "uuid": "ee6d61be-4841-4f98-8f23-5de9da846ca7",
+      "invariantUUID": "b7d923c9-6175-41f1-91ba-4565c4953408",
+      "name": "ServiceContainerMultiplepProbes",
+      "version": "1.0",
+      "toscaModelURL": null,
+      "category": "service",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": "DISTRIBUTION_COMPLETE_OK",
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "bd8ffd14-da36-4f62-813c-6716ba9f4354",
+      "invariantUUID": "b1f489c0-2aa0-47e1-ba6c-98658d6945bf",
+      "name": "Dror_service1806_Macro_NW",
+      "version": "1.0",
+      "toscaModelURL": null,
+      "category": "service",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": "DISTRIBUTION_COMPLETE_OK",
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "74fa72dd-012b-49c3-800d-06b12bcaf1a0",
+      "invariantUUID": "bceeaff9-5716-42bf-8fa1-8c6f720cf61d",
+      "name": "Dror_service1806_Macro1",
+      "version": "2.0",
+      "toscaModelURL": null,
+      "category": "service",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": "DISTRIBUTION_COMPLETE_OK",
+      "artifacts": null,
+      "resources": null
+    }
+  ],
+  "readOnly": false
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/service-with-configuration.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug616888/service-with-configuration.json
new file mode 100644 (file)
index 0000000..12d1c27
--- /dev/null
@@ -0,0 +1,170 @@
+{
+  "service": {
+    "uuid": "ee6d61be-4841-4f98-8f23-5de9da846ca7",
+    "invariantUuid": "b7d923c9-6175-41f1-91ba-4565c4953408",
+    "name": "ServiceContainerMultiplepProbes",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "Network L1-3",
+    "serviceType": "portMirroring",
+    "serviceRole": "pProbe",
+    "description": "sdfsdfsdf",
+    "serviceEcompNaming": "true",
+    "instantiationType": "ClientConfig",
+    "inputs": {}
+  },
+  "vnfs": {},
+  "networks": {},
+  "collectionResource": {},
+  "configurations": {
+    "Port Mirroring Configuration By Policy 1": {
+      "uuid": "f58d039d-4cfc-40ec-bd75-1f05f0458a6c",
+      "invariantUuid": "c30a024e-a6c6-4670-b73c-3df64eb57ff6",
+      "description": "A port mirroring configuration by policy object",
+      "name": "Port Mirroring Configuration By Policy",
+      "version": "1.0",
+      "customizationUuid": "4b7ebace-bad6-4526-9be6-bf248e20fc5f",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "collector_node": "pprobeservice_proxy 5",
+        "policy_name": "policy2",
+        "equip_vendor": "Cisco",
+        "equip_model": "Nexus 3048-TP"
+      },
+      "type": "Configuration",
+      "modelCustomizationName": "Port Mirroring Configuration By Policy 1",
+      "sourceNodes": [
+        "vmmeservice2_proxy 2",
+        "vmmeservice2_proxy 3",
+        "vmmeservice_proxy 1"
+      ],
+      "collectorNodes": [
+        "pprobeservice_proxy 5"
+      ],
+      "configurationByPolicy": true
+    },
+    "Port Mirroring Configuration By Policy 0": {
+      "uuid": "f58d039d-4cfc-40ec-bd75-1f05f0458a6c",
+      "invariantUuid": "c30a024e-a6c6-4670-b73c-3df64eb57ff6",
+      "description": "A port mirroring configuration by policy object",
+      "name": "Port Mirroring Configuration By Policy",
+      "version": "1.0",
+      "customizationUuid": "08a181aa-72eb-435f-9593-e88a3ad0a86b",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "collector_node": "pprobeservice_proxy 4",
+        "policy_name": "policy1",
+        "equip_vendor": "Cisco",
+        "equip_model": "Nexus 3048-TP"
+      },
+      "type": "Configuration",
+      "modelCustomizationName": "Port Mirroring Configuration By Policy 0",
+      "sourceNodes": [
+        "vmmeservice2_proxy 2",
+        "vmmeservice_proxy 1",
+        "vmmeservice_proxy 0"
+      ],
+      "collectorNodes": [
+        "pprobeservice_proxy 4"
+      ],
+      "configurationByPolicy": true
+    }
+  },
+  "serviceProxies": {
+    "vmmeservice_proxy 0": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService",
+      "name": "vmmeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "d7cfe338-eeda-4217-ba13-f24b0811fb17",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "c3e6c9bd-b24d-458e-aa99-e0cadf70c5e5",
+      "sourceModelInvariant": "dd8a805d-3946-4f11-9831-e26cd6aec9a3",
+      "sourceModelName": "vmmeService"
+    },
+    "vmmeservice_proxy 1": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService",
+      "name": "vmmeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "7a69f133-564c-4eb6-b93e-0a8281967efb",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "c3e6c9bd-b24d-458e-aa99-e0cadf70c5e5",
+      "sourceModelInvariant": "dd8a805d-3946-4f11-9831-e26cd6aec9a3",
+      "sourceModelName": "vmmeService"
+    },
+    "vmmeservice2_proxy 3": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService2",
+      "name": "vmmeService2 Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "9d81c21f-e29c-44f6-b5f6-caa974ee078a",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "2a2ea15f-07c6-4b89-bfca-e8aba39a34d6",
+      "sourceModelInvariant": "a7eac2b3-8444-40ee-92e3-b3359b32445c",
+      "sourceModelName": "vmmeService2"
+    },
+    "pprobeservice_proxy 4": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service pProbeService",
+      "name": "pProbeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "271efa3b-276e-4536-976a-cc9c9c014f1e",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "8a84e59b-45fe-4851-8ff1-34225a0b32c3",
+      "sourceModelInvariant": "83b458fd-5dd3-419b-a9e3-7335814a0911",
+      "sourceModelName": "pProbeService"
+    },
+    "pprobeservice_proxy 5": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service pProbeService",
+      "name": "pProbeService Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "d64623ae-5935-4afd-803e-c86e94d8e740",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "8a84e59b-45fe-4851-8ff1-34225a0b32c3",
+      "sourceModelInvariant": "83b458fd-5dd3-419b-a9e3-7335814a0911",
+      "sourceModelName": "pProbeService"
+    },
+    "vmmeservice2_proxy 2": {
+      "uuid": "a32fee17-5b59-4c34-ba6f-6dd2f1c61fee",
+      "invariantUuid": "2933b574-d28d-45ea-bf22-4df2907e4a10",
+      "description": "A Proxy for Service vmmeService2",
+      "name": "vmmeService2 Service Proxy",
+      "version": "1.0",
+      "customizationUuid": "060be63d-5f9c-4fd0-8ef7-830d5e8eca17",
+      "inputs": {},
+      "commands": {},
+      "properties": {},
+      "type": "Service Proxy",
+      "sourceModelUuid": "2a2ea15f-07c6-4b89-bfca-e8aba39a34d6",
+      "sourceModelInvariant": "a7eac2b3-8444-40ee-92e3-b3359b32445c",
+      "sourceModelName": "vmmeService2"
+    }
+  },
+  "vfModules": {},
+  "volumeGroups": {},
+  "pnfs": {}
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug_aLaCarteServiceWrongPopup/list-services.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug_aLaCarteServiceWrongPopup/list-services.json
new file mode 100644 (file)
index 0000000..c93191d
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "services": [
+    {
+      "uuid": "09c476c7-91ae-44b8-a731-04d8d8fa3695",
+      "invariantUUID": "11819cb5-0ad7-4c6d-9205-2ac30d09bdc6",
+      "name": "Mobility Networking Svc Mode",
+      "version": "1.0",
+      "toscaModelURL": null,
+      "category": "service",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": "DISTRIBUTION_COMPLETE_OK",
+      "artifacts": null,
+      "resources": null
+    }
+  ],
+  "readOnly": false
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug_aLaCarteServiceWrongPopup/serviceWithoutInstantiationType.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/bug_aLaCarteServiceWrongPopup/serviceWithoutInstantiationType.json
new file mode 100644 (file)
index 0000000..90ca612
--- /dev/null
@@ -0,0 +1,25 @@
+{
+  "service": {
+    "uuid": "09c476c7-91ae-44b8-a731-04d8d8fa3695",
+    "invariantUuid": "11819cb5-0ad7-4c6d-9205-2ac30d09bdc6",
+    "name": "Mobility Networking Svc Mode",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "Emanuel",
+    "serviceType": null,
+    "serviceRole": null,
+    "description": "single generic service model with mobility VLs in it to create any mobility network",
+    "serviceEcompNaming": "false",
+    "instantiationType": null,
+    "inputs": {}
+  },
+  "vnfs": {},
+  "networks": {},
+  "collectionResource": null,
+  "configurations": null,
+  "fabricConfigurations": {},
+  "serviceProxies": null,
+  "vfModules": null,
+  "volumeGroups": null,
+  "pnfs": null
+}
index 93a8bf5..e95d1d4 100644 (file)
@@ -2,8 +2,8 @@
   "categoryParameters": {
     "lineOfBusiness": [
       {
-        "id": "ECOMP",
-        "name": "ECOMP"
+        "id": "ONAP",
+        "name": "ONAP"
       },
       {
         "id": "zzz1",
       },
       {
         "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-        "name": "MetroPacketCore"
+        "name": "WayneHolland"
       },
       {
-        "id": "Wireline",
-        "name": "Wireline"
+        "id": "Melissa",
+        "name": "Melissa"
       }
     ],
     "project": [
       {
-        "id": "DFW",
-        "name": "DFW"
+        "id": "WATKINS",
+        "name": "WATKINS"
       },
       {
         "id": "x1",
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/createdFabricConfigService.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/createdFabricConfigService.json
new file mode 100644 (file)
index 0000000..3e55655
--- /dev/null
@@ -0,0 +1,51 @@
+{
+  "service": {
+    "uuid": "90004bb4-a416-4b4e-997e-0059973630b9",
+    "invariantUuid": "90003f9e-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": "ClientConfig",
+    "inputs": {
+
+    }
+  },
+  "vnfs": {
+
+  },
+  "networks": {
+
+  },
+  "collectionResource": {},
+  "configurations": {
+
+  },
+  "fabricConfigurations": {
+    "Fabric Configuration 0": {
+      "invariantUuid" : "1608eef4-de53-4334-a8d2-ba79cab4bddd",
+      "uuid": "88379cfd-fa0f-4946-8958-acc32640ceee",
+      "customizationUuid": "1e7f6512-c1cf-4b96-b5f5-b22a212ddad0",
+      "version": "3.0",
+      "name": "Fabric Configuration Object",
+      "description": "Fabric Configuration Object",
+      "type": "Configuration"
+    }
+  },
+  "serviceProxies": {
+
+  },
+  "vfModules": {
+
+  },
+  "volumeGroups": {
+
+  },
+  "pnfs": {
+
+  }
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/deactivatedFabricConfigService.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/deactivatedFabricConfigService.json
new file mode 100644 (file)
index 0000000..e3aeca4
--- /dev/null
@@ -0,0 +1,51 @@
+{
+  "service": {
+    "uuid": "10004bb4-a416-4b4e-997e-0059973630b9",
+    "invariantUuid": "10003f9e-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": "ClientConfig",
+    "inputs": {
+
+    }
+  },
+  "vnfs": {
+
+  },
+  "networks": {
+
+  },
+  "collectionResource": {},
+  "configurations": {
+
+  },
+  "fabricConfigurations": {
+    "Fabric Configuration 0": {
+      "invariantUuid" : "1608eef4-de53-4334-a8d2-ba79cab4bddd",
+      "uuid": "88379cfd-fa0f-4946-8958-acc32640ceee",
+      "customizationUuid": "1e7f6512-c1cf-4b96-b5f5-b22a212ddad0",
+      "version": "3.0",
+      "name": "Fabric Configuration Object",
+      "description": "Fabric Configuration Object",
+      "type": "Configuration"
+    }
+  },
+  "serviceProxies": {
+
+  },
+  "vfModules": {
+
+  },
+  "volumeGroups": {
+
+  },
+  "pnfs": {
+
+  }
+}
index bf54204..b1a139a 100644 (file)
             "inputs": {},
             "commands": {},
             "properties": {
+              "max_instances" : 10,
+              "min_instances"  : 1,
               "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",
+              "vmx_int_ctl_prefix": "10.0.0.10",
               "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",
+              "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
               "is_AVPN_service": "false",
               "vmx_RSG_name": "vREXI-affinity",
               "vmx_int_ctl_forwarding": "l2",
-              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvre_oam_ip_0": "10.0.0.10",
               "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
               "vmxvpfe_sriov41_0_port_vlanstrip": "false",
               "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
@@ -84,8 +86,8 @@
               "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",
+              "vmxvre_int_ctl_ip_0": "10.0.0.10",
+              "ecomp_generated_naming": "false",
               "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
               "vnf_name": "mtnj309me6vre",
               "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
               "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_oam_gateway": "10.0.0.10",
               "vmxvre_volume_name_1": "vREXI_FAVolume",
               "vmxvre_ore_present": "0",
               "vmxvre_volume_name_0": "vREXI_FBVolume",
             "inputs": {},
             "commands": {},
             "properties": {
+              "max_instances" : 10,
+              "min_instances"  : 1,
               "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",
+              "vmx_int_ctl_prefix": "10.0.0.10",
               "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",
+              "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
               "is_AVPN_service": "false",
               "vmx_RSG_name": "vREXI-affinity",
               "vmx_int_ctl_forwarding": "l2",
-              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvre_oam_ip_0": "10.0.0.10",
               "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
               "vmxvpfe_sriov41_0_port_vlanstrip": "false",
               "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
               "vf_module_id": "123",
               "nf_function": "JAI",
               "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
-              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "vmxvre_int_ctl_ip_0": "10.0.0.10",
               "ecomp_generated_naming": "true",
               "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
               "vnf_name": "mtnj309me6vre",
               "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_oam_gateway": "10.0.0.10",
               "vmxvre_volume_name_1": "vREXI_FAVolume",
               "vmxvre_ore_present": "0",
               "vmxvre_volume_name_0": "vREXI_FBVolume",
             "inputs": {},
             "commands": {},
             "properties": {
+              "max_instances" : 10,
+              "min_instances"  : 1,
               "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",
+              "vmx_int_ctl_prefix": "10.0.0.10",
               "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",
+              "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
               "is_AVPN_service": "false",
               "vmx_RSG_name": "vREXI-affinity",
               "vmx_int_ctl_forwarding": "l2",
-              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvre_oam_ip_0": "10.0.0.10",
               "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
               "vmxvpfe_sriov41_0_port_vlanstrip": "false",
               "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
               "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",
+              "vmxvre_int_ctl_ip_0": "10.0.0.10",
+              "ecomp_generated_naming": "false",
               "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
               "vnf_name": "mtnj309me6vre",
               "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
               "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_oam_gateway": "10.0.0.10",
               "vmxvre_volume_name_1": "vREXI_FAVolume",
               "vmxvre_ore_present": "0",
               "vmxvre_volume_name_0": "vREXI_FBVolume",
               "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",
+              "vmx_int_ctl_prefix": "10.0.0.10",
               "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",
+              "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
               "is_AVPN_service": "false",
               "vmx_RSG_name": "vREXI-affinity",
               "vmx_int_ctl_forwarding": "l2",
-              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvre_oam_ip_0": "10.0.0.10",
               "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
               "vmxvpfe_sriov41_0_port_vlanstrip": "false",
               "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
               "vf_module_id": "123",
               "nf_function": "ADIOD vPE",
               "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
-              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "vmxvre_int_ctl_ip_0": "10.0.0.10",
               "ecomp_generated_naming": "true",
               "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
               "vnf_name": "mtnj309me6vre",
               "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_oam_gateway": "10.0.0.10",
               "vmxvre_volume_name_1": "vREXI_FAVolume",
               "vmxvre_ore_present": "0",
               "vmxvre_volume_name_0": "vREXI_FBVolume",
     },
     "serviceInstance": {
       "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+        "existingVNFCounterMap": {},
+        "existingNetworksCounterMap" : {},
         "vnfs": {},
         "instanceParams": [
           {
         ],
         "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
         "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
-        "subscriptionServiceType": "VIRTUAL USP",
-        "lcpCloudRegionId": "AAIAIC25",
+        "subscriptionServiceType": "TYLER SILVIA",
+        "lcpCloudRegionId": "JANET25",
         "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
         "aicZoneId": "JAG1",
-        "projectName": "DFW",
+        "projectName": "WATKINS",
         "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
         "bulkSize": 1,
         "modelInfo": {
           "modelName": "action-data",
           "modelVersion": "1.0"
         },
-        "isUserProvidedNaming": false,
+        "isEcompGeneratedNaming": true,
         "tenantName": "USP-SIP-IC-24335-T-01",
-        "aicZoneName": "YUDFJULP-JAG1"
+        "aicZoneName": "YUDFJULP-JAG1",
+        "existingNames": {}
       }
     },
     "lcpRegionsAndTenants": {
       "lcpRegionList": [
         {
-          "id": "AAIAIC25",
-          "name": "AAIAIC25",
+          "id": "JANET25",
+          "name": "JANET25",
           "isPermitted": true
         },
         {
-          "id": "mtn6",
-          "name": "mtn6",
+          "id": "hvf6",
+          "name": "hvf6",
           "isPermitted": true
         }
       ],
       "lcpRegionsTenantsMap": {
-        "AAIAIC25": [
+        "JANET25": [
           {
             "id": "092eb9e8e4b7412e8787dd091bc58e86",
             "name": "USP-SIP-IC-24335-T-01",
             "isPermitted": true
           }
         ],
-        "mtn6": [
+        "hvf6": [
           {
             "id": "bae71557c5bb4d5aac6743a4e5f1d054",
-            "name": "AIN Web Tool-15-D-testgamma",
+            "name": "AIN Web Tool-15-D-testalexandria",
             "isPermitted": true
           },
           {
           },
           {
             "id": "d0a3e3f2964542259d155a81c41aadc3",
-            "name": "test-mtn6-09",
+            "name": "test-hvf6-09",
             "isPermitted": true
           },
           {
     "subscribers": [
       {
         "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
-        "name": "Mobility",
+        "name": "Emanuel",
         "isPermitted": false
       },
       {
         "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc",
-        "name": "PACKET CORE",
+        "name": "JULIO ERICKSON",
         "isPermitted": false
       },
       {
         "id": "e433710f-9217-458d-a79d-1c7aff376d89",
-        "name": "USP VOICE",
+        "name": "SILVIA ROBBINS",
         "isPermitted": true
       }
     ],
     "productFamilies": [
       {
         "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
-        "name": "DHV",
+        "name": "SCOTTIE",
         "isPermitted": true
       },
       {
         "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
-        "name": "FLEXREACH",
+        "name": "IGNACIO",
         "isPermitted": true
       },
       {
         "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
-        "name": "Netbond",
+        "name": "Christie",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "vRRaaS",
-        "name": "vRRaaS",
+        "id": "vTerrance",
+        "name": "vTerrance",
         "isPermitted": true
       },
       {
       },
       {
         "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
-        "name": "Mobility",
+        "name": "Emanuel",
         "isPermitted": true
       },
       {
       },
       {
         "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
-        "name": "FIRSTNET",
+        "name": "LINDSEY",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "vHNGWaas",
+        "id": "vRosemarie",
         "name": "HNGATEWAY",
         "isPermitted": true
       },
       {
         "id": "vHNPaas",
-        "name": "HNPORTAL",
+        "name": "WILKINS",
         "isPermitted": true
       },
       {
         "id": "e433710f-9217-458d-a79d-1c7aff376d89",
-        "name": "VIRTUAL USP",
+        "name": "TYLER SILVIA",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "VIPRaaS",
-        "name": "vIPRaaS",
+        "id": "Cisneros",
+        "name": "vMuriel",
         "isPermitted": true
       },
       {
         "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
-        "name": "WAN Bonding",
+        "name": "CARA Griffin",
         "isPermitted": true
       },
       {
         "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
-        "name": "HOSTED COMMUNICATIONS",
+        "name": "DARREN MCGEE",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "vVIGaaS",
-        "name": "vVIGaaS",
+        "id": "vSalvatore",
+        "name": "vSalvatore",
         "isPermitted": true
       },
       {
         "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
-        "name": "uCPE-VMS",
+        "name": "Josefina",
         "isPermitted": true
       },
       {
-        "id": "vPEaaS",
-        "name": "vPEaaS",
+        "id": "vHubbard",
+        "name": "vHubbard",
         "isPermitted": true
       },
       {
         "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
-        "name": "HOSTED COMMUNICATIONS",
+        "name": "DARREN MCGEE",
         "isPermitted": true
       }
     ],
       "e433710f-9217-458d-a79d-1c7aff376d89": [
         {
           "id": "0",
-          "name": "vFlowLogic",
+          "name": "vRichardson",
           "isPermitted": false
         },
         {
           "id": "1",
-          "name": "VIRTUAL USP",
+          "name": "TYLER SILVIA",
           "isPermitted": true
         },
         {
           "id": "2",
-          "name": "Mobility",
+          "name": "Emanuel",
           "isPermitted": false
         },
         {
           "id": "3",
-          "name": "vBNG",
+          "name": "vJamie",
           "isPermitted": false
         },
         {
         },
         {
           "id": "5",
-          "name": "Nimbus",
+          "name": "Kennedy",
           "isPermitted": false
         },
         {
         },
         {
           "id": "16",
-          "name": "FIRSTNET",
+          "name": "LINDSEY",
           "isPermitted": false
         },
         {
           "id": "17",
-          "name": "ACTIVE_CHARGE",
+          "name": "JOHANNA_SANTOS",
           "isPermitted": false
         },
         {
           "id": "18",
-          "name": "vHSS",
+          "name": "vCarroll",
           "isPermitted": false
         }
       ]
         },
         {
           "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-          "name": "MetroPacketCore"
+          "name": "WayneHolland"
         },
         {
-          "id": "Wireline",
-          "name": "Wireline"
+          "id": "Melissa",
+          "name": "Melissa"
         }
       ],
       "projectList": [
         {
-          "id": "DFW",
-          "name": "DFW"
+          "id": "WATKINS",
+          "name": "WATKINS"
         },
         {
           "id": "x1",
       ],
       "lineOfBusinessList": [
         {
-          "id": "ECOMP",
-          "name": "ECOMP"
+          "id": "ONAP",
+          "name": "ONAP"
         },
         {
           "id": "zzz1",
index a2e1543..b8c3136 100644 (file)
@@ -1,15 +1,23 @@
 {
-  "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_NETWORK_TO_ASYNC_INSTANTIATION": false,
   "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
-
+  "FLAG_SHOW_ASSIGNMENTS": true,
+  "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+  "FLAG_DUPLICATE_VNF":true,
+  "FLAG_DEFAULT_VNF" : true,
+  "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD" : true,
+  "FLAG_A_LA_CARTE_AUDIT_INFO": true,
+  "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": true,
+  "FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS": true,
+  "FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE": true,
+  "FLAG_1902_NEW_VIEW_EDIT": true,
+  "FLAG_VF_MODULE_RESUME_STATUS_CREATE" : true,
+  "FLAG_1906_COMPONENT_INFO": true
 }
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/responceForFailedInstance.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/responceForFailedInstance.json
new file mode 100644 (file)
index 0000000..8e5c236
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  "id":null,
+  "jobId":null,
+  "instanceName":null,
+  "instanceType":null,
+  "jobStatus":"FAILED",
+  "source":null,
+  "requestId":null,
+  "additionalInfo":"Http Code:500, RAW DATA FROM MSO",
+  "final":false,
+  "createdDate":1549198388000
+}
index 3da9015..5cb1c86 100644 (file)
         "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",
+        "vmx_int_ctl_prefix": "10.0.0.10",
         "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",
+        "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
         "is_AVPN_service": "false",
         "vmx_RSG_name": "vREXI-affinity",
         "vmx_int_ctl_forwarding": "l2",
-        "vmxvre_oam_ip_0": "10.40.123.5",
+        "vmxvre_oam_ip_0": "10.0.0.10",
         "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
         "vmxvpfe_sriov41_0_port_vlanstrip": "false",
         "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
@@ -68,7 +68,7 @@
         "vf_module_id": "123",
         "nf_function": "JAI",
         "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
-        "vmxvre_int_ctl_ip_0": "128.0.0.1",
+        "vmxvre_int_ctl_ip_0": "10.0.0.10",
         "ecomp_generated_naming": "true",
         "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
         "vnf_name": "mtnj309me6vre",
@@ -90,7 +90,7 @@
         "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_oam_gateway": "10.0.0.10",
         "vmxvre_volume_name_1": "vREXI_FAVolume",
         "vmxvre_ore_present": "0",
         "vmxvre_volume_name_0": "vREXI_FBVolume",
         "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",
+        "vmx_int_ctl_prefix": "10.0.0.10",
         "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",
+        "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
         "is_AVPN_service": "false",
         "vmx_RSG_name": "vREXI-affinity",
         "vmx_int_ctl_forwarding": "l2",
-        "vmxvre_oam_ip_0": "10.40.123.5",
+        "vmxvre_oam_ip_0": "10.0.0.10",
         "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
         "vmxvpfe_sriov41_0_port_vlanstrip": "false",
         "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
         "vf_module_id": "123",
         "nf_function": "JAI",
         "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
-        "vmxvre_int_ctl_ip_0": "128.0.0.1",
+        "vmxvre_int_ctl_ip_0": "10.0.0.10",
         "ecomp_generated_naming": "true",
         "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
         "vnf_name": "mtnj309me6vre",
         "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_oam_gateway": "10.0.0.10",
         "vmxvre_volume_name_1": "vREXI_FAVolume",
         "vmxvre_ore_present": "0",
         "vmxvre_volume_name_0": "vREXI_FBVolume",
         "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",
+        "vmx_int_ctl_prefix": "10.0.0.10",
         "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",
+        "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
         "is_AVPN_service": "false",
         "vmx_RSG_name": "vREXI-affinity",
         "vmx_int_ctl_forwarding": "l2",
-        "vmxvre_oam_ip_0": "10.40.123.5",
+        "vmxvre_oam_ip_0": "10.0.0.10",
         "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
         "vmxvpfe_sriov41_0_port_vlanstrip": "false",
         "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
         "vf_module_id": "123",
         "nf_function": "JAI",
         "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
-        "vmxvre_int_ctl_ip_0": "128.0.0.1",
+        "vmxvre_int_ctl_ip_0": "10.0.0.10",
         "ecomp_generated_naming": "true",
         "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
         "vnf_name": "mtnj309me6vre",
         "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_oam_gateway": "10.0.0.10",
         "vmxvre_volume_name_1": "vREXI_FAVolume",
         "vmxvre_ore_present": "0",
         "vmxvre_volume_name_0": "vREXI_FBVolume",
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceModels/ecompNamingFalseModel.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceModels/ecompNamingFalseModel.json
new file mode 100644 (file)
index 0000000..d34da2b
--- /dev/null
@@ -0,0 +1,1065 @@
+{
+  "service": {
+    "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+    "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "name": "action-data",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "",
+    "serviceType": "",
+    "serviceRole": "",
+    "description": "",
+    "serviceEcompNaming": "false",
+    "instantiationType": "Macro",
+    "inputs": {
+      "2017488_adiodvpe0_ASN": {
+        "type": "string",
+        "description": "AV/PE",
+        "entry_schema": null,
+        "inputProperties": null,
+        "constraints": [],
+        "required": true,
+        "default": "AV_vPE"
+      }
+    },
+    "vidNotions": {
+      "instantiationUI": "legacy",
+      "modelCategory": "other"
+    }
+  },
+  "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,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "17.2"
+        },
+        "bandwidth_units": {
+          "type": "string",
+          "description": "Units of bandwidth",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "Gbps"
+        },
+        "bandwidth": {
+          "type": "string",
+          "description": "Requested VPE bandwidth",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "10"
+        },
+        "AIC_CLLI": {
+          "type": "string",
+          "description": "AIC Site CLLI",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "ATLMY8GA"
+        },
+        "ASN": {
+          "type": "string",
+          "description": "AV/PE",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "AV_vPE"
+        },
+        "vnf_instance_name": {
+          "type": "string",
+          "description": "The hostname assigned to the vpe.",
+          "entry_schema": null,
+          "inputProperties": 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": "10.0.0.10",
+        "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": "10.0.0.10",
+        "is_AVPN_service": "false",
+        "vmx_RSG_name": "vREXI-affinity",
+        "vmx_int_ctl_forwarding": "l2",
+        "vmxvre_oam_ip_0": "10.0.0.10",
+        "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": "10.0.0.10",
+        "ecomp_generated_naming": "false",
+        "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.0.0.10",
+        "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": {
+        "vnf_config_template_version": {
+          "type": "string",
+          "description": "VPE Software Version",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "17.2"
+        },
+        "bandwidth_units": {
+          "type": "string",
+          "description": "Units of bandwidth",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "Gbps"
+        },
+        "bandwidth": {
+          "type": "string",
+          "description": "Requested VPE bandwidth",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "10"
+        },
+        "AIC_CLLI": {
+          "type": "string",
+          "description": "AIC Site CLLI",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "ATLMY8GA"
+        },
+        "ASN": {
+          "type": "string",
+          "description": "AV/PE",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "AV_vPE"
+        },
+        "vnf_instance_name": {
+          "type": "string",
+          "description": "The hostname assigned to the vpe.",
+          "entry_schema": null,
+          "inputProperties": 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": "10.0.0.10",
+        "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": "10.0.0.10",
+        "is_AVPN_service": "false",
+        "vmx_RSG_name": "vREXI-affinity",
+        "vmx_int_ctl_forwarding": "l2",
+        "vmxvre_oam_ip_0": "10.0.0.10",
+        "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",
+        "min_instances": "1",
+        "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+        "vf_module_id": "123",
+        "nf_function": "JAI",
+        "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+        "vmxvre_int_ctl_ip_0": "10.0.0.10",
+        "ecomp_generated_naming": "false",
+        "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.0.0.10",
+        "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": {
+        "vnf_config_template_version": {
+          "type": "string",
+          "description": "VPE Software Version",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "17.2"
+        },
+        "bandwidth_units": {
+          "type": "string",
+          "description": "Units of bandwidth",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "Gbps"
+        },
+        "bandwidth": {
+          "type": "string",
+          "description": "Requested VPE bandwidth",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "10"
+        },
+        "AIC_CLLI": {
+          "type": "string",
+          "description": "AIC Site CLLI",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "ATLMY8GA"
+        },
+        "ASN": {
+          "type": "string",
+          "description": "AV/PE",
+          "entry_schema": null,
+          "inputProperties": null,
+          "constraints": [],
+          "required": true,
+          "default": "AV_vPE"
+        },
+        "vnf_instance_name": {
+          "type": "string",
+          "description": "The hostname assigned to the vpe.",
+          "entry_schema": null,
+          "inputProperties": 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": "10.0.0.10",
+        "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": "10.0.0.10",
+        "is_AVPN_service": "false",
+        "vmx_RSG_name": "vREXI-affinity",
+        "vmx_int_ctl_forwarding": "l2",
+        "vmxvre_oam_ip_0": "10.0.0.10",
+        "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",
+        "max_instances": "3",
+        "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",
+        "min_instances": "1",
+        "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+        "vf_module_id": "123",
+        "nf_function": "JAI",
+        "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+        "vmxvre_int_ctl_ip_0": "10.0.0.10",
+        "ecomp_generated_naming": "false",
+        "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.0.0.10",
+        "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          },
+          "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",
+            "baseModule": true
+          },
+          "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",
+            "baseModule": false
+          },
+          "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          }
+        },
+        "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",
+            "baseModule": false
+          },
+          "inputs": {}
+        }
+      },
+      "vfcInstanceGroups": {}
+    }
+  },
+  "networks": {},
+  "collectionResource": {},
+  "configurations": {},
+  "fabricConfigurations": {},
+  "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",
+        "baseModule": false
+      },
+      "inputs": {
+        "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"
+          },
+          "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+          "constraints": null,
+          "required": true,
+          "default": "17.2"
+        },
+        "bandwidth_units": {
+          "type": "string",
+          "description": "Units of bandwidth",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "bandwidth_units"
+          },
+          "fromInputName": "adiodvpe0_bandwidth_units",
+          "constraints": null,
+          "required": true,
+          "default": "Gbps"
+        },
+        "bandwidth": {
+          "type": "string",
+          "description": "Requested VPE bandwidth",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "bandwidth"
+          },
+          "fromInputName": "adiodvpe0_bandwidth",
+          "constraints": null,
+          "required": true,
+          "default": "10"
+        },
+        "AIC_CLLI": {
+          "type": "string",
+          "description": "AIC Site CLLI",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "AIC_CLLI"
+          },
+          "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+          "constraints": null,
+          "required": true,
+          "default": "ATLMY8GA"
+        },
+        "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"
+          },
+          "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+          "constraints": null,
+          "required": true,
+          "default": "mtnj309me6"
+        }
+      },
+      "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",
+        "baseModule": true
+      },
+      "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",
+        "baseModule": false
+      },
+      "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",
+        "baseModule": false
+      },
+      "inputs": {
+        "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"
+          },
+          "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+          "constraints": null,
+          "required": true,
+          "default": "17.2"
+        },
+        "bandwidth_units": {
+          "type": "string",
+          "description": "Units of bandwidth",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "bandwidth_units"
+          },
+          "fromInputName": "adiodvpe0_bandwidth_units",
+          "constraints": null,
+          "required": true,
+          "default": "Gbps"
+        },
+        "bandwidth": {
+          "type": "string",
+          "description": "Requested VPE bandwidth",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "bandwidth"
+          },
+          "fromInputName": "adiodvpe0_bandwidth",
+          "constraints": null,
+          "required": true,
+          "default": "10"
+        },
+        "AIC_CLLI": {
+          "type": "string",
+          "description": "AIC Site CLLI",
+          "entry_schema": null,
+          "inputProperties": {
+            "sourceType": "HEAT",
+            "vfModuleLabel": "ADIOD_vRE_BV",
+            "paramName": "AIC_CLLI"
+          },
+          "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+          "constraints": null,
+          "required": true,
+          "default": "ATLMY8GA"
+        },
+        "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"
+          },
+          "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+          "constraints": null,
+          "required": true,
+          "default": "mtnj309me6"
+        }
+      }
+    },
+    "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",
+        "baseModule": false
+      },
+      "inputs": {}
+    }
+  },
+  "pnfs": {}
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceModels/serviceForNewViewEdit.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceModels/serviceForNewViewEdit.json
new file mode 100644 (file)
index 0000000..a749e57
--- /dev/null
@@ -0,0 +1,130 @@
+{
+  "service": {
+    "uuid": "a1531622-4e08-43fa-9ffd-222090cab7d2",
+    "invariantUuid": "c54c1178-ab4b-498c-aea0-52cc2043d44f",
+    "name": "mdns_2017_1011_IST_Service",
+    "version": "5.0",
+    "toscaModelURL": null,
+    "category": "Emanuel",
+    "serviceType": "",
+    "serviceRole": "",
+    "description": "mdns_2017_1011_IST_Service -Creating Service for PID 298109a",
+    "serviceEcompNaming": "true",
+    "instantiationType": "ClientConfig",
+    "inputs": {},
+    "vidNotions": {
+      "instantiationUI": "serviceWithVnfGrouping",
+      "modelCategory": "other",
+      "viewEditUI" : "serviceWithVnfGrouping"
+    }
+  },
+  "vnfs": {
+    "mdns_2017_1011_IST_Vf 0": {
+      "uuid": "e54ac8ab-746b-494d-918a-efab23a50e0d",
+      "invariantUuid": "b22715a2-4ec1-4e2f-bf4f-d79fa9519707",
+      "description": "mdns_2017_1011_IST_Vf -Creating for PID 298109a",
+      "name": "mdns_2017_1011_IST_Vf",
+      "version": "4.0",
+      "customizationUuid": "efa526df-e1f5-4fda-9e0d-475cb5e44e4f",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "nf_naming": "{naming_policy=gw1218.Config_MS_VmVnfcNamingPolicyMobility1710.*, ecomp_generated_naming=true}",
+        "multi_stage_design": "false",
+        "availability_zone_max_count": "1",
+        "ecomp_generated_naming": "true",
+        "node_count": "4.0",
+        "dns_image_name": "NIMBUS_MDNS_3.0.4.qcow2",
+        "route_eth0": "135.144.38.211/32 via 107.239.83.1 dev eth0 155.165.201.253/32 via 107.239.83.1 dev eth0 141.204.0.0/16 via 107.239.83.1 dev eth0 ",
+        "dns_flavor_name": "nv.c4r4d80"
+      },
+      "type": "VF",
+      "modelCustomizationName": "mdns_2017_1011_IST_Vf 0",
+      "vfModules": {
+        "mdns_2017_1011_ist_vf0..Mdns20171011IstVf..base_dns..module-0": {
+          "uuid": "1259fe65-4112-44ab-a622-cc9f99296c90",
+          "invariantUuid": "0be2f9a6-889a-45bd-9ba5-13ef9f62474b",
+          "customizationUuid": "89200091-4583-4f01-bc2b-aade7a0eb6de",
+          "description": null,
+          "name": "Mdns20171011IstVf..base_dns..module-0",
+          "version": "1",
+          "modelCustomizationName": "Mdns20171011IstVf..base_dns..module-0",
+          "properties": {
+            "minCountInstances": 1,
+            "maxCountInstances": 1,
+            "initialCount": 1,
+            "vfModuleLabel": "base_dns",
+            "baseModule": true
+          },
+          "inputs": {},
+          "volumeGroupAllowed": false
+        },
+        "mdns_2017_1011_ist_vf0..Mdns20171011IstVf..dns_az_01..module-1": {
+          "uuid": "c921c0dd-4f02-4b1e-8234-063675955c45",
+          "invariantUuid": "3744764d-32a1-468f-801d-2fc2485dc159",
+          "customizationUuid": "a86c56b6-7d7d-4bc1-b60f-ea384cadd232",
+          "description": null,
+          "name": "Mdns20171011IstVf..dns_az_01..module-1",
+          "version": "1",
+          "modelCustomizationName": "Mdns20171011IstVf..dns_az_01..module-1",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "dns_az_01",
+            "baseModule": false
+          },
+          "inputs": {},
+          "volumeGroupAllowed": false
+        }
+      },
+      "volumeGroups": {},
+      "vfcInstanceGroups": {}
+    }
+  },
+  "networks": {},
+  "collectionResource": {},
+  "configurations": {},
+  "fabricConfigurations": {},
+  "serviceProxies": {},
+  "vfModules": {
+    "mdns_2017_1011_ist_vf0..Mdns20171011IstVf..base_dns..module-0": {
+      "uuid": "1259fe65-4112-44ab-a622-cc9f99296c90",
+      "invariantUuid": "0be2f9a6-889a-45bd-9ba5-13ef9f62474b",
+      "customizationUuid": "89200091-4583-4f01-bc2b-aade7a0eb6de",
+      "description": null,
+      "name": "Mdns20171011IstVf..base_dns..module-0",
+      "version": "1",
+      "modelCustomizationName": "Mdns20171011IstVf..base_dns..module-0",
+      "properties": {
+        "minCountInstances": 1,
+        "maxCountInstances": 1,
+        "initialCount": 1,
+        "vfModuleLabel": "base_dns",
+        "baseModule": true
+      },
+      "inputs": {},
+      "volumeGroupAllowed": false
+    },
+    "mdns_2017_1011_ist_vf0..Mdns20171011IstVf..dns_az_01..module-1": {
+      "uuid": "c921c0dd-4f02-4b1e-8234-063675955c45",
+      "invariantUuid": "3744764d-32a1-468f-801d-2fc2485dc159",
+      "customizationUuid": "a86c56b6-7d7d-4bc1-b60f-ea384cadd232",
+      "description": null,
+      "name": "Mdns20171011IstVf..dns_az_01..module-1",
+      "version": "1",
+      "modelCustomizationName": "Mdns20171011IstVf..dns_az_01..module-1",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "dns_az_01",
+        "baseModule": false
+      },
+      "inputs": {},
+      "volumeGroupAllowed": false
+    }
+  },
+  "volumeGroups": {},
+  "pnfs": {}
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/aaiServiceInstances.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/aaiServiceInstances.json
new file mode 100644 (file)
index 0000000..b195be5
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "service-instances": [
+    {
+      "serviceInstanceId": "9cdd1b2a-43a7-47bc-a88e-759ba2399f0b",
+      "globalCustomerId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+      "serviceType": "vMOG",
+      "serviceInstanceName": "Network_repl_vMOG_rk",
+      "subscriberName": "Emanuel",
+      "aaiModelInvariantId": "92a72881-0a97-4d16-8c29-4831062e7e9b",
+      "aaiModelVersionId": "5a3ad576-c01d-4bed-8194-0e72b4a3d020",
+      "isPermitted": true
+    }
+  ]
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/aaiSubDetailsForServiceWithNetwork.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/aaiSubDetailsForServiceWithNetwork.json
new file mode 100644 (file)
index 0000000..b447e1d
--- /dev/null
@@ -0,0 +1,290 @@
+{
+  "global-customer-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+  "subscriber-name": "Emanuel",
+  "subscriber-type": "INFRA",
+  "resource-version": "1494001894192",
+  "service-subscriptions": {
+    "service-subscription": [
+      {
+        "service-type": "vMOG",
+        "resource-version": "1494001922173",
+        "service-instances": {
+          "service-instance": [
+            {
+              "service-instance-id": "8fa0d88e-5032-44bd-9b20-aa4ae6a367e9",
+              "service-instance-name": "portmirror123",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1518423771488",
+              "orchestration-status": "Active",
+              "model-invariant-id": "a1ac367e-3f20-43cb-801e-5cb381aef876",
+              "model-version-id": "bf0b17cd-8d34-423f-898f-197e1e1f28d3"
+            },
+            {
+              "service-instance-id": "b1dd14d1-4c8c-4c34-a96e-2064647ff57b",
+              "service-instance-name": "testing1",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1498998455761",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "ef4b81a1-bcff-4f97-b449-6b619b673ecb"
+            },
+            {
+              "service-instance-id": "5da732cc-548a-4732-ad2c-e7e7af3bcb85",
+              "service-instance-name": "aaa",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1499067629537",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "ef4b81a1-bcff-4f97-b449-6b619b673ecb"
+            },
+            {
+              "service-instance-id": "a16c64e3-dfa7-47c4-8c46-668e2030c304",
+              "service-instance-name": "shayTes2",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500193374856",
+              "orchestration-status": "Active",
+              "model-invariant-id": "74b2fa72-e3b9-4942-8448-983a4b50891a",
+              "model-version-id": "0c4b6e10-9e86-4eeb-9794-7649a8283a88"
+            },
+            {
+              "service-instance-id": "68ba015f-44d2-469a-bc1a-7e8883872047",
+              "service-instance-name": "cps_internal_ap7134_rk_01",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1516735672227",
+              "orchestration-status": "Active",
+              "model-invariant-id": "fa722b27-b7b1-4b55-8b4c-e2a128886707",
+              "model-version-id": "8022d5fb-14e7-4540-8936-e267cc85a65e"
+            },
+            {
+              "service-instance-id": "6293cd8e-ccc8-4280-9090-0d70212e3bc7",
+              "service-instance-name": "test_instance_123",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1526474108399",
+              "orchestration-status": "Active",
+              "model-invariant-id": "2fa617d0-50b3-4d74-861d-4b39301acd2c",
+              "model-version-id": "ae5d24f4-f602-46d0-9a62-ed3f28928b50"
+            },
+            {
+              "service-instance-id": "38ecafec-3866-4761-8a8c-fc494ef113ab",
+              "service-instance-name": "AMIR-VLAT-TEST1",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1529827612270",
+              "orchestration-status": "Active",
+              "model-invariant-id": "a8c50d3e-4432-4995-a4f8-4ea5f8f429c5",
+              "model-version-id": "36408993-d5b7-4fde-85ec-a90b368bf809"
+            },
+            {
+              "service-instance-id": "679e4e64-9e0d-4ece-99aa-ec6e7ff76bf4",
+              "service-instance-name": "test_instance_1",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1526473794492",
+              "orchestration-status": "Active",
+              "model-invariant-id": "2fa617d0-50b3-4d74-861d-4b39301acd2c",
+              "model-version-id": "ae5d24f4-f602-46d0-9a62-ed3f28928b50"
+            },
+            {
+              "service-instance-id": "07b0e569-a3d6-4896-95d7-26329b9e1770",
+              "service-instance-name": "Sanity_Testing_Macro_Inst_05032018_01",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1525380034682",
+              "orchestration-status": "Active",
+              "model-invariant-id": "d7b48529-6ae2-49f0-8633-b29e7cd4d4ce",
+              "model-version-id": "857d46ad-f4a0-4a8f-b03b-036801962288"
+            },
+            {
+              "service-instance-id": "77db498d-81bd-4915-85b7-bf9162297d55",
+              "service-instance-name": "RG_3-13_VidnfModel",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1520963958394",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "5229f73d-49d5-4cff-a61c-a37b8e3b529e"
+            },
+            {
+              "service-instance-id": "cea96d45-d447-4167-8c61-b201b32bc86f",
+              "service-instance-name": "Ayub_Sanity_Feb12",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1518459729277",
+              "orchestration-status": "Active",
+              "model-invariant-id": "35340388-0b82-4d3a-823d-cbddf842be52",
+              "model-version-id": "4e799efd-fd78-444d-bc25-4a3cde2f8cb0"
+            },
+            {
+              "service-instance-id": "a9ef8949-d734-4521-a187-776819fa06f5",
+              "service-instance-name": "Testing_VNF_010",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1520003561992",
+              "orchestration-status": "Active",
+              "model-invariant-id": "70ac3517-e462-4f2a-afee-85bea7a32d3b",
+              "model-version-id": "c2bee847-48ba-4025-9412-100a5eb9d065"
+            },
+            {
+              "service-instance-id": "7f10ffe2-548f-4168-8722-b782d05675b7",
+              "service-instance-name": "vMOG_SVC_UPDATED_FLAV_OAM_rk_01",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1516201909882",
+              "orchestration-status": "Active",
+              "model-invariant-id": "f959945d-7861-47d4-9230-2d1630da64a7",
+              "model-version-id": "e3f2698a-2d6c-434f-a9e6-486ce373cb75"
+            },
+            {
+              "service-instance-id": "7b9522cd-4ca7-48dc-aa6f-1b452d218558",
+              "service-instance-name": "Test997_1",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1530173862887",
+              "orchestration-status": "Active",
+              "model-invariant-id": "3d8a7716-4c1d-4dff-aff6-f415ed29d169",
+              "model-version-id": "b24e9a7e-0f2b-45dd-8ccf-e24a0483e653"
+            },
+            {
+              "service-instance-id": "e4c16d2e-ad49-4606-bfe7-e94bc6d3a65c",
+              "service-instance-name": "SI_Test_vidnf_10",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1496862990215",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "8379faac-f636-4792-a583-942a963f74d3"
+            },
+            {
+              "service-instance-id": "e07e88c3-f200-4740-87d4-272fa230179b",
+              "service-instance-name": "Viv+IST+demo+practice",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1494001827395",
+              "orchestration-status": null,
+              "model-invariant-id": "8b4b5a61-a9ba-4e93-a62d-f185fc3087f1",
+              "model-version-id": null
+            },
+            {
+              "service-instance-id": "3039ab56-5685-4766-b89c-0e46825c30a8",
+              "service-instance-name": "vMOG_mm779p_Service_WA_rk_01_rk_01",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1516025801425",
+              "orchestration-status": "Active",
+              "model-invariant-id": "1a27948c-7e8f-4ddc-9d39-743728ade3e1",
+              "model-version-id": "fa6e6dff-070e-449b-90ff-fab42ba8aee3"
+            },
+            {
+              "service-instance-id": "246a275d-da23-4f27-90a9-7b92411daa7f",
+              "service-instance-name": "Lital-Service-VID",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500792529406",
+              "orchestration-status": "Active",
+              "model-invariant-id": "35eeaa7e-9b0b-458b-8e73-066d43232b6a",
+              "model-version-id": "cb03c617-fd15-4ba3-beab-383e3eb80964"
+            },
+            {
+              "service-instance-id": "816fa49b-b217-4241-ab66-a4ebc6128670",
+              "service-instance-name": "test-9345349",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1508770603156",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "418f32e5-484a-4073-8fa9-fab7d497459f"
+            },
+            {
+              "service-instance-id": "6521fd4c-c5a2-4014-818b-f255b4b57941",
+              "service-instance-name": "Sanity_Test_Feb12",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1518461825378",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "418f32e5-484a-4073-8fa9-fab7d497459f"
+            },
+            {
+              "service-instance-id": "7a0143f2-9642-4578-a067-e0a5d9c8046c",
+              "service-instance-name": "vMOG_Network_OAM_rk_01",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1516741188293",
+              "orchestration-status": "Active",
+              "model-invariant-id": "862cda6c-d512-4979-8411-9927d944011c",
+              "model-version-id": "c0693f19-4d66-45ba-b53e-594314c915a4"
+            },
+            {
+              "service-instance-id": "a8ba2fc3-21d2-4853-b94e-f516bee76a66",
+              "service-instance-name": "test_macro_instantiation_01",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1518468689517",
+              "orchestration-status": "Active",
+              "model-invariant-id": "d27e42cf-087e-4d31-88ac-6c4b7585f800",
+              "model-version-id": "4d71990b-d8ad-4510-ac61-496288d9078e"
+            },
+            {
+              "service-instance-id": "13695dfb-db99-4c2f-905e-fe7bf2fc7b9f",
+              "service-instance-name": "FIRSTNET_DEMO",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1520879927295",
+              "orchestration-status": "Active",
+              "model-invariant-id": "34615cd5-3a9c-4237-81b9-cd06ff58a9a6",
+              "model-version-id": "a1528afd-0ebd-485a-b626-3b43000b60d1"
+            },
+            {
+              "service-instance-id": "6cf3bfc6-3737-4d81-b671-2e98302c2301",
+              "service-instance-name": "vMOG_mm779p_Service_WA_Inst",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1520272697916",
+              "orchestration-status": "Active",
+              "model-invariant-id": "1a27948c-7e8f-4ddc-9d39-743728ade3e1",
+              "model-version-id": "fa6e6dff-070e-449b-90ff-fab42ba8aee3"
+            },
+            {
+              "service-instance-id": "78b5ed16-ce98-4259-bb0d-e2cf7f2b8595",
+              "service-instance-name": "SVCTestSS",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1494001864868",
+              "orchestration-status": null,
+              "model-invariant-id": "4111e6e7-ad99-4b07-a143-e60c47295936",
+              "model-version-id": null
+            },
+            {
+              "service-instance-id": "9ac30ab4-f4bc-4905-9175-1abf0d853008",
+              "service-instance-name": "RG_3-6_VMOG_ServiceInstance",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1520370735401",
+              "orchestration-status": "Active",
+              "model-invariant-id": "1a27948c-7e8f-4ddc-9d39-743728ade3e1",
+              "model-version-id": "fa6e6dff-070e-449b-90ff-fab42ba8aee3"
+            },
+            {
+              "service-instance-id": "9cdd1b2a-43a7-47bc-a88e-759ba2399f0b",
+              "service-instance-name": "Network_repl_vMOG_rk",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1516045827731",
+              "orchestration-status": "Active",
+              "model-invariant-id": "92a72881-0a97-4d16-8c29-4831062e7e9b",
+              "model-version-id": "5a3ad576-c01d-4bed-8194-0e72b4a3d020"
+            }
+          ]
+        },
+        "is-permitted": true
+      }
+
+    ]
+  }
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/aaiSubViewEditForServiceWithNetwork.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/aaiSubViewEditForServiceWithNetwork.json
new file mode 100644 (file)
index 0000000..53f1612
--- /dev/null
@@ -0,0 +1,258 @@
+{
+  "inventory-response-item": [
+    {
+      "model-name": "Network_repl_vMOG",
+      "service-instance": {
+        "service-instance-id": "9cdd1b2a-43a7-47bc-a88e-759ba2399f0b",
+        "service-instance-name": "Network_repl_vMOG_rk"
+      },
+      "extra-properties": {},
+      "inventory-response-items": {
+        "inventory-response-item": [
+          {
+            "l3-network": {
+              "network-id": "7989a6d2-ba10-4a5d-8f15-4520bc833090",
+              "network-name": "APPC-24595-T-IST-02AShared_cor_direct_net_1",
+              "network-type": "CONTRAIL30_BASIC",
+              "network-role": "repl",
+              "network-technology": "contrail",
+              "neutron-network-id": "66ee6123-1c45-4e71-b6c0-a748ae0fee88",
+              "is-bound-to-vpn": true,
+              "service-id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+              "network-role-instance": 0,
+              "resource-version": "1516046029762",
+              "orchestration-status": "Created",
+              "heat-stack-id": "APPC-24595-T-IST-02AShared_cor_direct_net_1/e8b256aa-8ce1-4384-9d99-6606eaca9eac",
+              "contrail-network-fqdn": "default-domain:APPC-24595-T-IST-02C:APPC-24595-T-IST-02AShared_cor_direct_net_1",
+              "physical-network-name": "FALSE",
+              "is-provider-network": false,
+              "is-shared-network": true,
+              "is-external-network": true
+            },
+            "extra-properties": {},
+            "inventory-response-items": {
+              "inventory-response-item": [
+                {
+                  "subnet": {
+                    "subnet-id": "d5623e03-3927-40aa-8de4-ef46c35fc01c",
+                    "subnet-name": "S4_rk_cor_direct",
+                    "neutron-subnet-id": "5e34c945-812c-4d3c-b7db-d408526d58b7",
+                    "gateway-address": "10.0.0.10",
+                    "network-start-address": "10.0.0.10",
+                    "cidr-mask": "25",
+                    "ip-version": "4",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": false,
+                    "dhcp-start": "",
+                    "dhcp-end": "",
+                    "ip-assignment-direction": "false",
+                    "resource-version": "1516046029815"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "subnet": {
+                    "subnet-id": "24921ae7-c739-4ac2-a8fe-32e8ba8a9888",
+                    "subnet-name": "S8_rk_cor_direct",
+                    "neutron-subnet-id": "c183255c-0a35-4420-8dbb-e96b8d989770",
+                    "gateway-address": "2606:ae00:2e10:40::1",
+                    "network-start-address": "2606:ae00:2e10:40::0",
+                    "cidr-mask": "64",
+                    "ip-version": "6",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": false,
+                    "dhcp-start": "",
+                    "dhcp-end": "",
+                    "ip-assignment-direction": "false",
+                    "resource-version": "1516046029791"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "subnet": {
+                    "subnet-id": "c8e757c5-416d-4fa4-83d1-c099be0e8cdb",
+                    "subnet-name": "S2_rk_cor_direct",
+                    "neutron-subnet-id": "2ad97d5c-df2f-4ea9-8310-ea8911b12422",
+                    "gateway-address": "2606:ae00:2e10::1",
+                    "network-start-address": "2606:ae00:2e10::0",
+                    "cidr-mask": "64",
+                    "ip-version": "6",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": false,
+                    "dhcp-start": "",
+                    "dhcp-end": "",
+                    "ip-assignment-direction": "false",
+                    "resource-version": "1516046029906"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "subnet": {
+                    "subnet-id": "ff098d42-deb3-432e-a6a8-04b37d4569aa",
+                    "subnet-name": "S7_rk_cor_direct",
+                    "neutron-subnet-id": "91450e6f-2634-4746-88ba-a234312365d1",
+                    "gateway-address": "10.0.0.10",
+                    "network-start-address": "10.0.0.10",
+                    "cidr-mask": "25",
+                    "ip-version": "4",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": true,
+                    "dhcp-start": "10.0.0.10",
+                    "dhcp-end": "10.0.0.10",
+                    "ip-assignment-direction": "true",
+                    "resource-version": "1516046029889"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "subnet": {
+                    "subnet-id": "3069ca48-c228-485d-bee4-845ab65cd347",
+                    "subnet-name": "S5_rk_cor_direct",
+                    "neutron-subnet-id": "43731fee-e891-4cc8-8476-f995f890f8d0",
+                    "gateway-address": "10.0.0.10",
+                    "network-start-address": "10.0.0.10",
+                    "cidr-mask": "28",
+                    "ip-version": "4",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": false,
+                    "dhcp-start": "",
+                    "dhcp-end": "",
+                    "ip-assignment-direction": "false",
+                    "resource-version": "1516046029774"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "subnet": {
+                    "subnet-id": "ba4a94e7-14c6-45b1-adc8-ec6c4e6d73eb",
+                    "subnet-name": "S6_rk_cor_direct",
+                    "neutron-subnet-id": "b55ff2b2-1d2f-41af-b872-1bcca2e1061b",
+                    "gateway-address": "10.0.0.10",
+                    "network-start-address": "10.0.0.10",
+                    "cidr-mask": "28",
+                    "ip-version": "4",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": false,
+                    "dhcp-start": "",
+                    "dhcp-end": "",
+                    "ip-assignment-direction": "false",
+                    "resource-version": "1516046029922"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "subnet": {
+                    "subnet-id": "8ab38c73-de01-483e-a86c-c2e566d4cde1",
+                    "subnet-name": "S3_rk_cor_direct",
+                    "neutron-subnet-id": "9ec533a7-998f-4c99-a70b-d4601d2a377f",
+                    "gateway-address": "10.0.0.10",
+                    "network-start-address": "10.0.0.10",
+                    "cidr-mask": "25",
+                    "ip-version": "4",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": false,
+                    "dhcp-start": "",
+                    "dhcp-end": "",
+                    "ip-assignment-direction": "false",
+                    "resource-version": "1516046029799"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "subnet": {
+                    "subnet-id": "3659ce61-3c12-4e4c-b453-d97076e74dbb",
+                    "subnet-name": "S12_rk_cor_direct",
+                    "neutron-subnet-id": "1b204870-f5a4-474a-a779-5fc3c0e103db",
+                    "gateway-address": "2606:ae00:2e10:44::1",
+                    "network-start-address": "2606:ae00:2e10:44::0",
+                    "cidr-mask": "64",
+                    "ip-version": "6",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": true,
+                    "dhcp-start": "2606:ae00:2e10:44::3",
+                    "dhcp-end": "2606:ae00:2e10:44::7f",
+                    "ip-assignment-direction": "true",
+                    "resource-version": "1516046029873"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "subnet": {
+                    "subnet-id": "0275b352-91d3-48ae-b6d4-fdb8fc00aaee",
+                    "subnet-name": "S1_rk_cor_direct",
+                    "neutron-subnet-id": "81d83779-14fb-4c90-8ecc-8bdcb83e3033",
+                    "gateway-address": "10.0.0.10",
+                    "network-start-address": "10.0.0.10",
+                    "cidr-mask": "24",
+                    "ip-version": "4",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": true,
+                    "dhcp-start": "10.0.0.10",
+                    "dhcp-end": "10.0.0.10",
+                    "ip-assignment-direction": "true",
+                    "resource-version": "1516046029856"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "subnet": {
+                    "subnet-id": "2607039d-eef4-47cd-9403-a8e5dcfeae02",
+                    "subnet-name": "S11_rk_cor_direct",
+                    "neutron-subnet-id": "5d7f2857-1308-4eda-861c-fc86293dfe1f",
+                    "gateway-address": "2606:ae00:2e10:43::1",
+                    "network-start-address": "2606:ae00:2e10:43::0",
+                    "cidr-mask": "64",
+                    "ip-version": "6",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": false,
+                    "dhcp-start": "",
+                    "dhcp-end": "",
+                    "ip-assignment-direction": "false",
+                    "resource-version": "1516046029839"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "subnet": {
+                    "subnet-id": "18757c6a-015d-403b-990f-4d41511aec4b",
+                    "subnet-name": "S9_rk_cor_direct",
+                    "neutron-subnet-id": "97d83e23-db35-46cf-93f8-8bbb7ff0b279",
+                    "gateway-address": "2606:ae00:2e10:41::1",
+                    "network-start-address": "2606:ae00:2e10:41::0",
+                    "cidr-mask": "64",
+                    "ip-version": "6",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": false,
+                    "dhcp-start": "",
+                    "dhcp-end": "",
+                    "ip-assignment-direction": "false",
+                    "resource-version": "1516046029831"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "subnet": {
+                    "subnet-id": "3fc931a8-b3f8-45ce-b75e-0ce6df2bbf7d",
+                    "subnet-name": "S10_rk_cor_direct",
+                    "neutron-subnet-id": "aec8e0eb-eb0f-459b-be1f-2bd6d44d7c6d",
+                    "gateway-address": "2606:ae00:2e10:42::1",
+                    "network-start-address": "2606:ae00:2e10:42::0",
+                    "cidr-mask": "64",
+                    "ip-version": "6",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": false,
+                    "dhcp-start": "",
+                    "dhcp-end": "",
+                    "ip-assignment-direction": "false",
+                    "resource-version": "1516046029848"
+                  },
+                  "extra-properties": {}
+                }
+              ]
+            }
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/serviceWithNetwork.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithNetwork/serviceWithNetwork.json
new file mode 100644 (file)
index 0000000..35539dd
--- /dev/null
@@ -0,0 +1,47 @@
+{
+  "service": {
+    "uuid": "5a3ad576-c01d-4bed-8194-0e72b4a3d020",
+    "invariantUuid": "92a72881-0a97-4d16-8c29-4831062e7e9b",
+    "name": "Network_repl_vMOG",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "Emanuel",
+    "serviceType": "",
+    "serviceRole": "",
+    "description": "tbd",
+    "serviceEcompNaming": "true",
+    "instantiationType": "ClientConfig",
+    "inputs": {}
+  },
+  "vnfs": {},
+  "networks": {
+    "CONTRAIL30_BASIC 0": {
+      "uuid": "2920cd06-f585-436b-a002-c3081f6a91b3",
+      "invariantUuid": "56f4e746-c58e-4b76-93d4-6717b8f59205",
+      "description": "Basic contrail 3.0.x L3 network for AIC 3.x sites. Keeping for existing mobility networks. ",
+      "name": "CONTRAIL30_BASIC",
+      "version": "3.0",
+      "customizationUuid": "8e2128bf-77e8-4a48-84d0-520c44718161",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "network_role": "NetworkReplVmog.repl",
+        "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_scope": "Service",
+        "network_type": "CONTRAIL30_BASIC",
+        "network_homing": "{ecomp_selected_instance_node_target=false}"
+      },
+      "type": "VL",
+      "modelCustomizationName": "CONTRAIL30_BASIC 0"
+    }
+  },
+  "collectionResource": {},
+  "configurations": {},
+  "fabricConfigurations": {},
+  "serviceProxies": {},
+  "vfModules": {},
+  "volumeGroups": {},
+  "pnfs": {}
+}
index a95803f..c9f1580 100644 (file)
@@ -4,17 +4,17 @@
   },
   "service": {
     "serviceHierarchy": {
-      "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+      "f4d84bb4-a416-4b4e-997e-0059973630b9": {
         "service": {
-          "uuid": "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
-          "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
-          "name": "action-data",
+          "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": "",
+          "category": "Network L1-3",
           "serviceType": "",
           "serviceRole": "",
-          "description": "",
+          "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
           "serviceEcompNaming": "true",
           "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: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",
+            "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": "5.0",
-            "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+            "version": "9.0",
+            "customizationUuid": "41516cc6-5098-4b40-a619-f8d5f55fc4d8",
             "inputs": {},
             "commands": {},
             "properties": {
               "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",
+              "vmx_int_ctl_prefix": "10.0.0.10",
               "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",
+              "nf_type": "ROUTER",
+              "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
               "is_AVPN_service": "false",
               "vmx_RSG_name": "vREXI-affinity",
               "vmx_int_ctl_forwarding": "l2",
-              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvre_oam_ip_0": "10.0.0.10",
               "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_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}",
-              "nf_naming_code": "Navneet",
+              "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": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+              "vmxvpfe_image_name_0": "vpfe172_nova_img",
               "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
               "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
               "vmxvre_console": "vidconsole",
               "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
               "vmxvpfe_sriov44_0_port_vlanstrip": "false",
               "vf_module_id": "123",
-              "nf_function": "JAI",
+              "nf_function": "ADIOD vPE",
               "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
-              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "vmxvre_int_ctl_ip_0": "10.0.0.10",
               "ecomp_generated_naming": "true",
               "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
               "vnf_name": "mtnj309me6vre",
               "vmxvre_volume_type_0": "HITACHI",
               "vmxvpfe_volume_type_0": "HITACHI",
               "vmxvpfe_sriov43_0_port_broadcastallow": "true",
-              "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+              "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
               "vnf_id": "123",
               "vmxvre_oam_prefix": "24",
-              "availability_zone_0": "mtpocfo-kvm-az01",
+              "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:adiodvpe0_bandwidth",
+              "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_oam_gateway": "10.0.0.10",
               "vmxvre_volume_name_1": "vREXI_FAVolume",
               "vmxvre_ore_present": "0",
               "vmxvre_volume_name_0": "vREXI_FBVolume",
               "vmxvpfe_sriov41_0_port_broadcastallow": "true",
               "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
               "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
-              "nf_role": "Testing",
+              "nf_role": "vPE",
               "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
               "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
               "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
             "modelCustomizationName": "2017-488_ADIOD-vPE 0",
             "vfModules": {
               "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
-                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
                 "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
-                "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
                 "description": null,
                 "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
-                "version": "6",
+                "version": "8",
                 "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
                 "properties": {
                   "minCountInstances": 0,
                   "vfModuleLabel": "ADIOD_vRE_BV"
                 },
                 "inputs": {
-                  "adiodvpe0_bandwidth": {
+                  "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,
                     "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",
+                "uuid": "040e591e-5d30-4e0d-850f-7266e5a8e013",
                 "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
-                "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                "customizationUuid": "5c5f91f9-5e31-4120-b892-5536587ec258",
                 "description": null,
                 "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
-                "version": "5",
+                "version": "6",
                 "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
                 "properties": {
                   "minCountInstances": 1,
                 "volumeGroupAllowed": false
               },
               "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
-                "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+                "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
                 "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
-                "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+                "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
                 "description": null,
                 "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
-                "version": "6",
+                "version": "8",
                 "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
                 "properties": {
                   "minCountInstances": 0,
                   "initialCount": 0,
                   "vfModuleLabel": "ADIOD_vPFE_BV"
                 },
-                "inputs": {},
+                "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": "25284168-24bb-4698-8cb4-3f509146eca5",
+                "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
                 "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
-                "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
                 "description": null,
                 "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
-                "version": "6",
+                "version": "8",
                 "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
                 "properties": {
                   "minCountInstances": 0,
                   "vfModuleLabel": "ADIOD_vRE_BV"
                 },
                 "inputs": {
-                  "adiodvpe0_bandwidth": {
+                  "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,
                     "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",
+                "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
                 "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
-                "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+                "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
                 "description": null,
                 "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
-                "version": "6",
+                "version": "8",
                 "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
                 "properties": {
                   "minCountInstances": 0,
                   "initialCount": 0,
                   "vfModuleLabel": "ADIOD_vPFE_BV"
                 },
-                "inputs": {}
+                "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": {}
         "serviceProxies": {},
         "vfModules": {
           "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
-            "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+            "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
             "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
-            "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+            "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
             "description": null,
             "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
-            "version": "6",
+            "version": "8",
             "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
             "properties": {
               "minCountInstances": 0,
               "vfModuleLabel": "ADIOD_vRE_BV"
             },
             "inputs": {
-              "adiodvpe0_bandwidth": {
+              "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,
                 "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",
+            "uuid": "040e591e-5d30-4e0d-850f-7266e5a8e013",
             "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
-            "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+            "customizationUuid": "5c5f91f9-5e31-4120-b892-5536587ec258",
             "description": null,
             "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
-            "version": "5",
+            "version": "6",
             "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
             "properties": {
               "minCountInstances": 1,
             "volumeGroupAllowed": false
           },
           "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
-            "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+            "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
             "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
-            "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+            "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
             "description": null,
             "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
-            "version": "6",
+            "version": "8",
             "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
             "properties": {
               "minCountInstances": 0,
               "initialCount": 0,
               "vfModuleLabel": "ADIOD_vPFE_BV"
             },
-            "inputs": {},
+            "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": "25284168-24bb-4698-8cb4-3f509146eca5",
+            "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
             "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
-            "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+            "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
             "description": null,
             "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
-            "version": "6",
+            "version": "8",
             "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
             "properties": {
               "minCountInstances": 0,
               "vfModuleLabel": "ADIOD_vRE_BV"
             },
             "inputs": {
-              "adiodvpe0_bandwidth": {
+              "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,
                 "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",
+            "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
             "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
-            "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+            "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
             "description": null,
             "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
-            "version": "6",
+            "version": "8",
             "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
             "properties": {
               "minCountInstances": 0,
               "initialCount": 0,
               "vfModuleLabel": "ADIOD_vPFE_BV"
             },
-            "inputs": {}
+            "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": {}
       },
-      "f4d84bb4-a416-4b4e-997e-0059973630b9": {
+      "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
         "service": {
-          "uuid": "f4d84bb4-a416-4b4e-997e-0059973630b9",
-          "invariantUuid": "598e3f9e-3244-4d8f-a8e0-0e5d7a29eda9",
-          "name": "ADIOD vMX vPE_BV Service 488",
+          "uuid": "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+          "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+          "name": "action-data",
           "version": "1.0",
           "toscaModelURL": null,
-          "category": "Network L1-3",
+          "category": "",
           "serviceType": "",
           "serviceRole": "",
-          "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
+          "description": "",
           "serviceEcompNaming": "true",
           "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": "10.0.0.10",
+              "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": "10.0.0.10",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.0.0.10",
+              "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": "10.0.0.10",
+              "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.0.0.10",
+              "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": "10.0.0.10",
+              "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": "10.0.0.10",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.0.0.10",
+              "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": "10.0.0.10",
+              "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.0.0.10",
+              "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": "ea81d6f7-0861-44a7-b7d5-d173b562c350",
-            "invariantUuid": "5be7e99e-8eb2-4d97-be63-8081ff3cd10e",
+            "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": "9.0",
-            "customizationUuid": "41516cc6-5098-4b40-a619-f8d5f55fc4d8",
+            "version": "5.0",
+            "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
             "inputs": {},
             "commands": {},
             "properties": {
               "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",
+              "vmx_int_ctl_prefix": "10.0.0.10",
               "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",
+              "nf_type": "vPE",
+              "vmxvpfe_int_ctl_ip_1": "10.0.0.10",
               "is_AVPN_service": "false",
               "vmx_RSG_name": "vREXI-affinity",
               "vmx_int_ctl_forwarding": "l2",
-              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvre_oam_ip_0": "10.0.0.10",
               "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_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}",
-              "multi_stage_design": "false",
-              "nf_naming_code": "me6",
+              "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": "vpfe172_nova_img",
+              "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_sriov42_0_port_unknownmulticastallow": "true",
               "vmxvpfe_sriov44_0_port_vlanstrip": "false",
               "vf_module_id": "123",
-              "nf_function": "ADIOD vPE",
+              "nf_function": "JAI",
               "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
-              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "vmxvre_int_ctl_ip_0": "10.0.0.10",
               "ecomp_generated_naming": "true",
               "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
               "vnf_name": "mtnj309me6vre",
               "vmxvre_volume_type_0": "HITACHI",
               "vmxvpfe_volume_type_0": "HITACHI",
               "vmxvpfe_sriov43_0_port_broadcastallow": "true",
-              "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+              "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
               "vnf_id": "123",
               "vmxvre_oam_prefix": "24",
-              "availability_zone_0": "get_input:2017488_adiodvpe0_availability_zone_0",
+              "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",
+              "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_oam_gateway": "10.0.0.10",
               "vmxvre_volume_name_1": "vREXI_FAVolume",
               "vmxvre_ore_present": "0",
               "vmxvre_volume_name_0": "vREXI_FBVolume",
               "vmxvpfe_sriov41_0_port_broadcastallow": "true",
               "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
               "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
-              "nf_role": "vPE",
+              "nf_role": "Testing",
               "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
               "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
               "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
             "modelCustomizationName": "2017-488_ADIOD-vPE 0",
             "vfModules": {
               "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
-                "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
                 "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
-                "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+                "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
                 "description": null,
                 "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
-                "version": "8",
+                "version": "6",
                 "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
                 "properties": {
                   "minCountInstances": 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": {
+                  "adiodvpe0_bandwidth": {
                     "type": "string",
                     "description": "Requested VPE bandwidth",
                     "entry_schema": null,
                     "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": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+                "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
                 "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
-                "customizationUuid": "5c5f91f9-5e31-4120-b892-5536587ec258",
+                "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
                 "description": null,
                 "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
-                "version": "6",
+                "version": "5",
                 "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
                 "properties": {
                   "minCountInstances": 1,
                 "volumeGroupAllowed": false
               },
               "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
-                "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+                "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
                 "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
-                "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+                "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
                 "description": null,
                 "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
-                "version": "8",
+                "version": "6",
                 "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
                 "properties": {
                   "minCountInstances": 0,
                   "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"
-                  }
-                },
+                "inputs": {},
                 "volumeGroupAllowed": true
               }
             },
             "volumeGroups": {
               "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
-                "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
                 "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
-                "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+                "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
                 "description": null,
                 "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
-                "version": "8",
+                "version": "6",
                 "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
                 "properties": {
                   "minCountInstances": 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": {
+                  "adiodvpe0_bandwidth": {
                     "type": "string",
                     "description": "Requested VPE bandwidth",
                     "entry_schema": null,
                     "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": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+                "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
                 "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
-                "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+                "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
                 "description": null,
                 "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
-                "version": "8",
+                "version": "6",
                 "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
                 "properties": {
                   "minCountInstances": 0,
                   "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"
-                  }
-                }
+                "inputs": {}
               }
             },
             "vfcInstanceGroups": {}
         "serviceProxies": {},
         "vfModules": {
           "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
-            "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+            "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
             "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
-            "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+            "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
             "description": null,
             "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
-            "version": "8",
+            "version": "6",
             "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
             "properties": {
               "minCountInstances": 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": {
+              "adiodvpe0_bandwidth": {
                 "type": "string",
                 "description": "Requested VPE bandwidth",
                 "entry_schema": null,
                 "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": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+            "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
             "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
-            "customizationUuid": "5c5f91f9-5e31-4120-b892-5536587ec258",
+            "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
             "description": null,
             "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
-            "version": "6",
+            "version": "5",
             "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
             "properties": {
               "minCountInstances": 1,
             "volumeGroupAllowed": false
           },
           "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
-            "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+            "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
             "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
-            "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+            "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
             "description": null,
             "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
-            "version": "8",
+            "version": "6",
             "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
             "properties": {
               "minCountInstances": 0,
               "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"
-              }
-            },
+            "inputs": {},
             "volumeGroupAllowed": true
           }
         },
         "volumeGroups": {
           "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
-            "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+            "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
             "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
-            "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+            "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
             "description": null,
             "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
-            "version": "8",
+            "version": "6",
             "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
             "properties": {
               "minCountInstances": 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": {
+              "adiodvpe0_bandwidth": {
                 "type": "string",
                 "description": "Requested VPE bandwidth",
                 "entry_schema": null,
                 "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": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+            "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
             "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
-            "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+            "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
             "description": null,
             "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
-            "version": "8",
+            "version": "6",
             "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
             "properties": {
               "minCountInstances": 0,
               "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"
-              }
-            }
+            "inputs": {}
           }
         },
         "pnfs": {}
     },
     "serviceInstance": {
       "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+        "existingVNFCounterMap": {
+          "280dec31-f16d-488b-9668-4aae55d6648a": 1,
+          "1da7b585-5e61-4993-b95e-8e6606c81e45": 1
+        },
         "vnfs": {
           "2017-388_ADIOD-vPE 1": {
             "rollbackOnFailure": "false",
             "vfModules": {},
             "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
-            "lcpCloudRegionId": "mtn6",
+            "lcpCloudRegionId": "hvf6",
             "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
             "lineOfBusiness": "zzz1",
             "platformName": "platform",
+            "originalName": "2017-388_ADIOD-vPE 1",
             "modelInfo": {
               "modelType": "service",
               "modelInvariantId": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
               "modelVersion": "1.0",
               "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a",
               "modelCustomizationName": "2017-388_ADIOD-vPE 1"
-            },
-            "isUserProvidedNaming": false
+            }
           },
           "2017-488_ADIOD-vPE 0": {
             "rollbackOnFailure": "false",
+            "originalName": "2017-488_ADIOD-vPE 0",
             "vfModules": {
               "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
                 "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
               }
             },
             "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
-            "lcpCloudRegionId": "mtn6",
+            "lcpCloudRegionId": "hvf6",
             "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
-            "lineOfBusiness": "ECOMP",
+            "lineOfBusiness": "ONAP",
             "platformName": "platform",
             "modelInfo": {
               "modelType": "service",
               "modelVersion": "5.0",
               "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
               "modelCustomizationName": "2017-488_ADIOD-vPE 0"
-            },
-            "isUserProvidedNaming": false
+            }
           }
         },
         "instanceParams": [
         ],
         "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
         "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
-        "subscriptionServiceType": "VIRTUAL USP",
-        "lcpCloudRegionId": "AAIAIC25",
+        "subscriptionServiceType": "TYLER SILVIA",
+        "lcpCloudRegionId": "JANET25",
         "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
         "aicZoneId": "JAG1",
-        "projectName": "DFW",
+        "projectName": "WATKINS",
         "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
         "bulkSize": 1,
         "modelInfo": {
           "modelName": "action-data",
           "modelVersion": "1.0"
         },
-        "isUserProvidedNaming": false,
+        "isEcompGeneratedNaming": true,
         "tenantName": "USP-SIP-IC-24335-T-01",
         "aicZoneName": "YUDFJULP-JAG1"
       }
     "lcpRegionsAndTenants": {
       "lcpRegionList": [
         {
-          "id": "AAIAIC25",
-          "name": "AAIAIC25",
+          "id": "JANET25",
+          "name": "JANET25",
           "isPermitted": true
         },
         {
-          "id": "mtn6",
-          "name": "mtn6",
+          "id": "hvf6",
+          "name": "hvf6",
           "isPermitted": true
         }
       ],
       "lcpRegionsTenantsMap": {
-        "AAIAIC25": [
+        "JANET25": [
           {
             "id": "092eb9e8e4b7412e8787dd091bc58e86",
             "name": "USP-SIP-IC-24335-T-01",
             "isPermitted": true
           }
         ],
-        "mtn6": [
+        "hvf6": [
           {
             "id": "bae71557c5bb4d5aac6743a4e5f1d054",
-            "name": "AIN Web Tool-15-D-testgamma",
+            "name": "AIN Web Tool-15-D-testalexandria",
             "isPermitted": true
           },
           {
           },
           {
             "id": "d0a3e3f2964542259d155a81c41aadc3",
-            "name": "test-mtn6-09",
+            "name": "test-hvf6-09",
             "isPermitted": true
           },
           {
     "subscribers": [
       {
         "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
-        "name": "Mobility",
+        "name": "Emanuel",
         "isPermitted": false
       },
       {
         "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc",
-        "name": "PACKET CORE",
+        "name": "JULIO ERICKSON",
         "isPermitted": false
       },
       {
         "id": "e433710f-9217-458d-a79d-1c7aff376d89",
-        "name": "USP VOICE",
+        "name": "SILVIA ROBBINS",
         "isPermitted": true
       }
     ],
     "productFamilies": [
       {
         "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
-        "name": "DHV",
+        "name": "SCOTTIE",
         "isPermitted": true
       },
       {
         "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
-        "name": "FLEXREACH",
+        "name": "IGNACIO",
         "isPermitted": true
       },
       {
         "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
-        "name": "Netbond",
+        "name": "Christie",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "vRRaaS",
-        "name": "vRRaaS",
+        "id": "vTerrance",
+        "name": "vTerrance",
         "isPermitted": true
       },
       {
       },
       {
         "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
-        "name": "Mobility",
+        "name": "Emanuel",
         "isPermitted": true
       },
       {
       },
       {
         "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
-        "name": "FIRSTNET",
+        "name": "LINDSEY",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "vHNGWaas",
+        "id": "vRosemarie",
         "name": "HNGATEWAY",
         "isPermitted": true
       },
       {
         "id": "vHNPaas",
-        "name": "HNPORTAL",
+        "name": "WILKINS",
         "isPermitted": true
       },
       {
         "id": "e433710f-9217-458d-a79d-1c7aff376d89",
-        "name": "VIRTUAL USP",
+        "name": "TYLER SILVIA",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "VIPRaaS",
-        "name": "vIPRaaS",
+        "id": "Cisneros",
+        "name": "vMuriel",
         "isPermitted": true
       },
       {
         "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
-        "name": "WAN Bonding",
+        "name": "CARA Griffin",
         "isPermitted": true
       },
       {
         "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
-        "name": "HOSTED COMMUNICATIONS",
+        "name": "DARREN MCGEE",
         "isPermitted": true
       },
       {
         "isPermitted": true
       },
       {
-        "id": "vVIGaaS",
-        "name": "vVIGaaS",
+        "id": "vSalvatore",
+        "name": "vSalvatore",
         "isPermitted": true
       },
       {
         "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
-        "name": "uCPE-VMS",
+        "name": "Josefina",
         "isPermitted": true
       },
       {
-        "id": "vPEaaS",
-        "name": "vPEaaS",
+        "id": "vHubbard",
+        "name": "vHubbard",
         "isPermitted": true
       },
       {
         "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
-        "name": "HOSTED COMMUNICATIONS",
+        "name": "DARREN MCGEE",
         "isPermitted": true
       }
     ],
       "e433710f-9217-458d-a79d-1c7aff376d89": [
         {
           "id": "0",
-          "name": "vFlowLogic",
+          "name": "vRichardson",
           "isPermitted": false
         },
         {
           "id": "1",
-          "name": "VIRTUAL USP",
+          "name": "TYLER SILVIA",
           "isPermitted": true
         },
         {
           "id": "2",
-          "name": "Mobility",
+          "name": "Emanuel",
           "isPermitted": false
         },
         {
           "id": "3",
-          "name": "vBNG",
+          "name": "vJamie",
           "isPermitted": false
         },
         {
         },
         {
           "id": "5",
-          "name": "Nimbus",
+          "name": "Kennedy",
           "isPermitted": false
         },
         {
         },
         {
           "id": "16",
-          "name": "FIRSTNET",
+          "name": "LINDSEY",
           "isPermitted": false
         },
         {
           "id": "17",
-          "name": "ACTIVE_CHARGE",
+          "name": "JOHANNA_SANTOS",
           "isPermitted": false
         },
         {
           "id": "18",
-          "name": "vHSS",
+          "name": "vCarroll",
           "isPermitted": false
         }
       ]
         },
         {
           "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
-          "name": "MetroPacketCore"
+          "name": "WayneHolland"
         },
         {
-          "id": "Wireline",
-          "name": "Wireline"
+          "id": "Melissa",
+          "name": "Melissa"
         }
       ],
       "projectList": [
         {
-          "id": "DFW",
-          "name": "DFW"
+          "id": "WATKINS",
+          "name": "WATKINS"
         },
         {
           "id": "x1",
       ],
       "lineOfBusinessList": [
         {
-          "id": "ECOMP",
-          "name": "ECOMP"
+          "id": "ONAP",
+          "name": "ONAP"
         },
         {
           "id": "zzz1",
index 088fbe7..2d1ee5a 100644 (file)
@@ -2,21 +2,21 @@
   "customer": [
     {
       "global-customer-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
-      "subscriber-name": "Mobility",
+      "subscriber-name": "Emanuel",
       "subscriber-type": "INFRA",
       "resource-version": "1494255056308",
       "is-permitted": false
     },
     {
       "global-customer-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc",
-      "subscriber-name": "PACKET CORE",
+      "subscriber-name": "JULIO ERICKSON",
       "subscriber-type": "INFRA",
       "resource-version": "1506548476111",
       "is-permitted": false
     },
     {
       "global-customer-id": "e433710f-9217-458d-a79d-1c7aff376d89",
-      "subscriber-name": "USP VOICE",
+      "subscriber-name": "SILVIA ROBBINS",
       "subscriber-type": "INFRA",
       "is-permitted": true
     }
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/tenants.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/tenants.json
new file mode 100644 (file)
index 0000000..30d53b4
--- /dev/null
@@ -0,0 +1,233 @@
+[
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "USP-SIP-IC-24335-T-01",
+    "tenantID": "092eb9e8e4b7412e8787dd091bc58e86",
+    "cloudRegionID": "JANET25",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AIN Web Tool-15-D-testalexandria",
+    "tenantID": "bae71557c5bb4d5aac6743a4e5f1d054",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AIN Web Tool-15-D-STTest2",
+    "tenantID": "229bcdc6eaeb4ca59d55221141d01f8e",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AIN Web Tool-15-D-SSPtestcustome",
+    "tenantID": "1178612d2b394be4834ad77f567c0af2",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AIN Web Tool-15-D-UncheckedEcopm",
+    "tenantID": "19c5ade915eb461e8af52fb2fd8cd1f2",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AIN Web Tool-15-D-dfsdf",
+    "tenantID": "de007636e25249238447264a988a927b",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AIN/SMS-16-D-Multiservices1",
+    "tenantID": "62f29b3613634ca6a3065cbe0e020c44",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AIN Web Tool-15-D-SSPST66",
+    "tenantID": "649289e30d3244e0b48098114d63c2aa",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AIN Web Tool-15-D-ASSPST47",
+    "tenantID": "3f21eeea6c2c486bba31dab816c05a32",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "CESAR-100-D-sspjg67246",
+    "tenantID": "f60ce21d3ee6427586cff0d22b03b773",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "CESAR-100-D-sspjg68359",
+    "tenantID": "8774659e425f479895ae091bb5d46560",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AINWebTool-15-D-iftach",
+    "tenantID": "624eb554b0d147c19ff8885341760481",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "CESAR-100-D-sspjg612401",
+    "tenantID": "214f55f5fc414c678059c383b03e4962",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "CESAR-100-D-sspjg621340",
+    "tenantID": "c90666c291664841bb98e4d981ff1db5",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "sspjg621351cloned",
+    "tenantID": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AINWebTool-15-D-eteancomp",
+    "tenantID": "b386b768a3f24c8e953abbe0b3488c02",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AINWebTool-15-T-SPFET",
+    "tenantID": "dc6c4dbfd225474e9deaadd34968646c",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AINWebTool-15-X-eeweww",
+    "tenantID": "02cb5030e9914aa4be120bd9ed1e19eb",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "CESAR-100-D-spjg61909",
+    "tenantID": "f2f3830e4c984d45bcd00e1a04158a79",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "CESAR-100-D-sspjg621512cloned",
+    "tenantID": "05b91bd5137f4929878edd965755c06d",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AINWebTool-15-X-vdr",
+    "tenantID": "7002fbe8482d4a989ddf445b1ce336e0",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AINWebTool-15-D-ssasa",
+    "tenantID": "4008522be43741dcb1f5422022a2aa0b",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AINWebTool-15-D-PFNPT",
+    "tenantID": "f44e2e96a1b6476abfda2fa407b00169",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AINWebTool-15-X-vdre",
+    "tenantID": "b69a52bec8a84669a37a1e8b72708be7",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "AINWebTool-15-X-NONPODECOMP",
+    "tenantID": "fac7d9fd56154caeb9332202dcf2969f",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "DN5242-Nov16-T5",
+    "tenantID": "2d34d8396e194eb49969fd61ffbff961",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "ro-T11",
+    "tenantID": "cb42a77ff45b48a8b8deb83bb64acc74",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "ro-T112",
+    "tenantID": "fa45ca53c80b492fa8be5477cd84fc2b",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "DN5242-Nov21-T1",
+    "tenantID": "4914ab0ab3a743e58f0eefdacc1dde77",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "test-hvf6-09",
+    "tenantID": "d0a3e3f2964542259d155a81c41aadc3",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "DN5242-Nov16-T3",
+    "tenantID": "cbb99fe4ada84631b7baf046b6fd2044",
+    "cloudRegionID": "hvf6",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "DN5242-Nov16-T3XXX",
+    "tenantID": "cbb99fe4ada84631b7baf046b6fd2XXX",
+    "cloudRegionID": "olson3",
+    "is-permitted": true
+  },
+  {
+    "cloudOwner": "irma-aic",
+    "tenantName": "DN5242-Nov16-T3YYY",
+    "tenantID": "cbb99fe4ada84631b7baf046b6fd2YYY",
+    "cloudRegionID": "olson5a",
+    "is-permitted": true
+  }
+]
index 92627f4..4aefadd 100644 (file)
@@ -1,8 +1,8 @@
 {
-  "contactUsLink": "https://wiki.web.att.com/display/EcompPortal/ECOMP+Portal+Home",
+  "contactUsLink": "https://www.openecomp.org/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",
+  "portalUrl": "http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/process_csp",
+  "getAccessUrl": "http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/get_access",
   "userName": "uspVoiceVirtualUsp null",
   "userid": "uspVoiceVirtualUsp"
 }
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/version.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/version.json
new file mode 100644 (file)
index 0000000..1559ef2
--- /dev/null
@@ -0,0 +1,5 @@
+{
+  "features": "1810.features.properties",
+  "build": "1.0.1481",
+  "displayVersion": "1902.1948"
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/vnfGroupBasicServiceInstance.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/vnfGroupBasicServiceInstance.json
new file mode 100644 (file)
index 0000000..bba5ec1
--- /dev/null
@@ -0,0 +1,32 @@
+{
+  "existingVNFCounterMap":{},
+  "existingVnfGroupCounterMap":{},
+  "existingNetworksCounterMap":{},
+  "optionalGroupMembersMap":{},
+  "vnfs":{},
+  "vnfGroups":{},
+  "instanceParams":[
+    {
+      "2017488_adiodvpe0_ASN":"AV_vPE"
+    }],
+  "globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89",
+  "subscriptionServiceType":"TYLER SILVIA",
+  "projectName":"WATKINS",
+  "owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+  "bulkSize":1,
+  "modelInfo":{
+    "modelType":"service",
+    "modelInvariantId":"7ee41ce4-4827-44b0-a48e-2707a59905d2",
+    "modelVersionId":"4117a0b6-e234-467d-b5b9-fe2f68c8b0fc",
+    "modelName":"Grouping Service for Test",
+    "modelVersion":"1.0"
+  },
+  "existingNames":{},
+  "instanceName": "Grouping_Service_Instance",
+  "subscriberName":"SILVIA ROBBINS",
+  "owningEntityName":"WayneHolland",
+  "rollbackOnFailure":"true",
+  "testApi": "VNF_API",
+  "isALaCarte":true,
+  "action": "Create"
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/vnfGroupsBasicModel.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/vnfGroupsBasicModel.json
new file mode 100644 (file)
index 0000000..73e6366
--- /dev/null
@@ -0,0 +1,1430 @@
+{
+  "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"
+            }
+          }
+        },
+        "vnfGroups": {
+          "ResourceGroup0": {
+            "type": "VnfGroup",
+            "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+            "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+            "version": "1",
+            "name": "ResourceGroup0",
+            "modelCustomizationName": "ResourceGroup0",
+            "properties": {
+              "contained_resource_type": "VF",
+              "role": "SERVICE-ACCESS",
+              "function": "DATA",
+              "description": "DDD0",
+              "type": "LOAD-GROUP"
+            },
+            "members": {
+              "vdbe_svc_vprs_proxy 0": {
+                "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+                "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+                "description": "A Proxy for Service vDBE_Svc_vPRS",
+                "name": "vDBE_Svc_vPRS Service Proxy",
+                "version": "1.0",
+                "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9",
+                "inputs": {},
+                "commands": {},
+                "properties": {},
+                "type": "Service Proxy",
+                "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274",
+                "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14",
+                "sourceModelName": "vDBE_Svc_vPRS"
+              },
+              "vdbe_svc_vprs_proxy 1": {
+                "uuid": "111dfa8-a0d9-443f-95ad-836cd044e26c",
+                "invariantUuid": "111ae0c-b3a5-4ca1-a777-afbffe7010bc",
+                "description": "A Proxy for Service vDBE_Svc_vPRS",
+                "name": "111_Svc_vPRS Service Proxy",
+                "version": "1.0",
+                "customizationUuid": "1113d23-e132-4ce7-af2c-a493b4cafac9",
+                "inputs": {},
+                "commands": {},
+                "properties": {},
+                "type": "Service Proxy",
+                "sourceModelUuid": "11127a2-366d-4be6-8c68-a69153c61274",
+                "sourceModelInvariant": "1112e6b-584b-4f45-80d4-fefd75fd9f14",
+                "sourceModelName": "111_Svc_vPRS"
+              }
+            }
+          }
+        },
+        "networks": {},
+        "collectionResource": {},
+        "configurations": {},
+        "serviceProxies": {},
+        "vfModules": {},
+        "volumeGroups": {},
+        "pnfs": {}
+      }
+    },
+    "serviceInstance": {
+      "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+        "existingVNFCounterMap": {},
+        "existingVnfGroupCounterMap": {},
+        "existingNetworksCounterMap": {},
+        "vnfs": {},
+        "vnfGroups": {},
+        "instanceParams": [
+          {
+            "2017488_adiodvpe0_ASN": "AV_vPE"
+          }
+        ],
+        "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+        "subscriptionServiceType": "TYLER SILVIA",
+        "lcpCloudRegionId": "JANET25",
+        "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+        "aicZoneId": "JAG1",
+        "projectName": "WATKINS",
+        "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"
+        },
+        "isEcompGeneratedNaming": true,
+        "tenantName": "USP-SIP-IC-24335-T-01",
+        "aicZoneName": "YUDFJULP-JAG1",
+        "existingNames": {}
+      }
+    },
+    "lcpRegionsAndTenants": {
+      "lcpRegionList": [
+        {
+          "id": "JANET25",
+          "name": "JANET25 (AIC)",
+          "isPermitted": true,
+          "cloudOwner": "irma-aic"
+        },
+        {
+          "id": "hvf6",
+          "name": "hvf6 (AIC)",
+          "isPermitted": true,
+          "cloudOwner": "irma-aic"
+        }
+      ],
+      "lcpRegionsTenantsMap": {
+        "JANET25": [
+          {
+            "id": "092eb9e8e4b7412e8787dd091bc58e86",
+            "name": "USP-SIP-IC-24335-T-01",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }
+        ],
+        "hvf6": [
+          {
+            "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+            "name": "AIN Web Tool-15-D-testalexandria",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "name": "AIN Web Tool-15-D-STTest2",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "1178612d2b394be4834ad77f567c0af2",
+            "name": "AIN Web Tool-15-D-SSPtestcustome",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+            "name": "AIN Web Tool-15-D-UncheckedEcopm",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "de007636e25249238447264a988a927b",
+            "name": "AIN Web Tool-15-D-dfsdf",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "62f29b3613634ca6a3065cbe0e020c44",
+            "name": "AIN/SMS-16-D-Multiservices1",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "649289e30d3244e0b48098114d63c2aa",
+            "name": "AIN Web Tool-15-D-SSPST66",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "3f21eeea6c2c486bba31dab816c05a32",
+            "name": "AIN Web Tool-15-D-ASSPST47",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "f60ce21d3ee6427586cff0d22b03b773",
+            "name": "CESAR-100-D-sspjg67246",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "8774659e425f479895ae091bb5d46560",
+            "name": "CESAR-100-D-sspjg68359",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "624eb554b0d147c19ff8885341760481",
+            "name": "AINWebTool-15-D-iftach",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "214f55f5fc414c678059c383b03e4962",
+            "name": "CESAR-100-D-sspjg612401",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "c90666c291664841bb98e4d981ff1db5",
+            "name": "CESAR-100-D-sspjg621340",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+            "name": "sspjg621351cloned",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "b386b768a3f24c8e953abbe0b3488c02",
+            "name": "AINWebTool-15-D-eteancomp",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "dc6c4dbfd225474e9deaadd34968646c",
+            "name": "AINWebTool-15-T-SPFET",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+            "name": "AINWebTool-15-X-eeweww",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "f2f3830e4c984d45bcd00e1a04158a79",
+            "name": "CESAR-100-D-spjg61909",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "05b91bd5137f4929878edd965755c06d",
+            "name": "CESAR-100-D-sspjg621512cloned",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "7002fbe8482d4a989ddf445b1ce336e0",
+            "name": "AINWebTool-15-X-vdr",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "4008522be43741dcb1f5422022a2aa0b",
+            "name": "AINWebTool-15-D-ssasa",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "f44e2e96a1b6476abfda2fa407b00169",
+            "name": "AINWebTool-15-D-PFNPT",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "b69a52bec8a84669a37a1e8b72708be7",
+            "name": "AINWebTool-15-X-vdre",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "fac7d9fd56154caeb9332202dcf2969f",
+            "name": "AINWebTool-15-X-NONPODECOMP",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "2d34d8396e194eb49969fd61ffbff961",
+            "name": "DN5242-Nov16-T5",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+            "name": "ro-T11",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+            "name": "ro-T112",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+            "name": "DN5242-Nov21-T1",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "d0a3e3f2964542259d155a81c41aadc3",
+            "name": "test-hvf6-09",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          },
+          {
+            "id": "cbb99fe4ada84631b7baf046b6fd2044",
+            "name": "DN5242-Nov16-T3",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }
+        ]
+      }
+    },
+    "subscribers": [
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "name": "Emanuel",
+        "isPermitted": false
+      },
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc",
+        "name": "JULIO ERICKSON",
+        "isPermitted": false
+      },
+      {
+        "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "name": "SILVIA ROBBINS",
+        "isPermitted": true
+      }
+    ],
+    "productFamilies": [
+      {
+        "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+        "name": "SCOTTIE",
+        "isPermitted": true
+      },
+      {
+        "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+        "name": "IGNACIO",
+        "isPermitted": true
+      },
+      {
+        "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+        "name": "Christie",
+        "isPermitted": true
+      },
+      {
+        "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+        "name": "Enhanced Services",
+        "isPermitted": true
+      },
+      {
+        "id": "vTerrance",
+        "name": "vTerrance",
+        "isPermitted": true
+      },
+      {
+        "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+        "name": "vSCP",
+        "isPermitted": true
+      },
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "name": "Emanuel",
+        "isPermitted": true
+      },
+      {
+        "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+        "name": "BVOIP",
+        "isPermitted": true
+      },
+      {
+        "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+        "name": "LINDSEY",
+        "isPermitted": true
+      },
+      {
+        "id": "LRSI-OSPF",
+        "name": "LRSI-OSPF",
+        "isPermitted": true
+      },
+      {
+        "id": "vRosemarie",
+        "name": "HNGATEWAY",
+        "isPermitted": true
+      },
+      {
+        "id": "vHNPaas",
+        "name": "WILKINS",
+        "isPermitted": true
+      },
+      {
+        "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "name": "TYLER SILVIA",
+        "isPermitted": true
+      },
+      {
+        "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+        "name": "VROUTER",
+        "isPermitted": true
+      },
+      {
+        "id": "Cisneros",
+        "name": "vMuriel",
+        "isPermitted": true
+      },
+      {
+        "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+        "name": "CARA Griffin",
+        "isPermitted": true
+      },
+      {
+        "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+        "name": "DARREN MCGEE",
+        "isPermitted": true
+      },
+      {
+        "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+        "name": "Transport",
+        "isPermitted": true
+      },
+      {
+        "id": "vSalvatore",
+        "name": "vSalvatore",
+        "isPermitted": true
+      },
+      {
+        "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+        "name": "Josefina",
+        "isPermitted": true
+      },
+      {
+        "id": "vHubbard",
+        "name": "vHubbard",
+        "isPermitted": true
+      },
+      {
+        "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+        "name": "DARREN MCGEE",
+        "isPermitted": true
+      }
+    ],
+    "serviceTypes": {
+      "e433710f-9217-458d-a79d-1c7aff376d89": [
+        {
+          "id": "0",
+          "name": "vRichardson",
+          "isPermitted": false
+        },
+        {
+          "id": "1",
+          "name": "TYLER SILVIA",
+          "isPermitted": true
+        },
+        {
+          "id": "2",
+          "name": "Emanuel",
+          "isPermitted": false
+        },
+        {
+          "id": "3",
+          "name": "vJamie",
+          "isPermitted": false
+        },
+        {
+          "id": "4",
+          "name": "vVoiceMail",
+          "isPermitted": false
+        },
+        {
+          "id": "5",
+          "name": "Kennedy",
+          "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": "LINDSEY",
+          "isPermitted": false
+        },
+        {
+          "id": "17",
+          "name": "JOHANNA_SANTOS",
+          "isPermitted": false
+        },
+        {
+          "id": "18",
+          "name": "vCarroll",
+          "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": "ad5a17e0-4ee1-4287-bdb7-25848042d265",
+          "name": "046e7910-c114-4198-adb4-3bcd41f78a63"
+        },
+        {
+          "id": "482de866-5306-4917-a54d-044d3a5cbeae",
+          "name": "14553d7c-a9ce-427d-b043-2761b2e0b468"
+        },
+        {
+          "id": "509a94a3-c6b3-4164-aa06-27abed58574e",
+          "name": "2753cf38-e4c7-4e47-adf8-3d0a5d897352"
+        },
+        {
+          "id": "dd7cb3b5-ed8f-4261-9f2e-5e88e5a0b54e",
+          "name": "2e544d86-b1f9-4d44-8a78-16ea16ca9bf4"
+        },
+        {
+          "id": "fefb7398-36d2-4860-887b-4d8745ec7e88",
+          "name": "7f49941a-4f6b-4184-8139-1f46464361f8"
+        },
+        {
+          "id": "5a8de060-efdc-4793-a506-115fed2ac9ef",
+          "name": "88f08647-8abc-4d86-894d-ccdd8cabd8cf"
+        },
+        {
+          "id": "f2c501d8-4e22-43cf-be58-83a925c2fc70",
+          "name": "a6f81e25-8b4c-4f82-9d1d-bf09ef8ca2ea"
+        },
+        {
+          "id": "aaa1",
+          "name": "aaa1"
+        },
+        {
+          "id": "1d67282c-e51f-4bfe-afa0-ae0d9081d1fc",
+          "name": "af2c6ca4-665e-4263-b78d-86ede27d452c"
+        },
+        {
+          "id": "840a8a2a-9bf2-40c5-af8f-015d62cf5250",
+          "name": "c214ad5a-34e7-49ed-b7a9-aa9f9546a2d3"
+        },
+        {
+          "id": "d093cd6f-73b8-4750-968a-c93e7567af66",
+          "name": "caa6e570-b1ee-4620-bdfd-dc7bb5aedcb1"
+        },
+        {
+          "id": "f85da3ed-669f-424d-8e05-b71149519643",
+          "name": "f05eaa46-7ce5-4610-93b4-928199b97b5b"
+        },
+        {
+          "id": "970ef4d5-d5f4-4992-b7a1-98dfc4de73fb",
+          "name": "fd160c26-c5d3-4623-8f6a-2028509029cc"
+        },
+        {
+          "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+          "name": "WayneHolland"
+        },
+        {
+          "id": "Melissa",
+          "name": "Melissa"
+        }
+      ],
+      "projectList": [
+        {
+          "id": "WATKINS",
+          "name": "WATKINS"
+        },
+        {
+          "id": "x1",
+          "name": "x1"
+        },
+        {
+          "id": "yyy1",
+          "name": "yyy1"
+        }
+      ],
+      "lineOfBusinessList": [
+        {
+          "id": "ONAP",
+          "name": "ONAP"
+        },
+        {
+          "id": "zzz1",
+          "name": "zzz1"
+        }
+      ],
+      "platformList": [
+        {
+          "id": "platform",
+          "name": "platform"
+        },
+        {
+          "id": "xxx1",
+          "name": "xxx1"
+        }
+      ]
+    },
+    "type": "UPDATE_LCP_REGIONS_AND_TENANTS"
+  },
+  "global": {
+    "name": null
+  }
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/permission.mock.ts b/vid-webpack-master/cypress/support/jsonBuilders/mocks/permission.mock.ts
new file mode 100644 (file)
index 0000000..a69d725
--- /dev/null
@@ -0,0 +1,29 @@
+declare namespace Cypress {
+  interface Chainable {
+    permissionVidMock: typeof permissionVidMock;
+    initDrawingBoardUserPermission : typeof  initDrawingBoardUserPermission;
+  }
+}
+
+
+
+function initDrawingBoardUserPermission( response?: any , delay?: number, status?: number) : void {
+    cy.server()
+      .route({
+        method: 'GET',
+        delay : delay ? delay : 0,
+        status : status ? status : 200,
+        url : Cypress.config('baseUrl') + "/roles/service_permissions?**",
+        response : response ? response : {
+          isEditPermitted : true
+        }
+      }).as('isEditPermitted');
+}
+
+function permissionVidMock(): void {
+  initDrawingBoardUserPermission();
+}
+
+
+Cypress.Commands.add('permissionVidMock', permissionVidMock);
+Cypress.Commands.add('initDrawingBoardUserPermission', initDrawingBoardUserPermission);
index 5bc02d1..8b25488 100644 (file)
@@ -3,6 +3,9 @@ declare namespace Cypress {
     initVidMock: typeof initVidMock;
     preventErrorsOnLoading : typeof preventErrorsOnLoading;
     initCategoryParameter : typeof initCategoryParameter;
+    initAuditInfoMSO: typeof initAuditInfoMSO;
+    initAuditInfoMSOALaCarte: typeof initAuditInfoMSOALaCarte;
+    initAsyncInstantiation : typeof  initAsyncInstantiation;
   }
 }
 
@@ -34,7 +37,7 @@ function initCategoryParameter(response? : JSON) : void {
           status : 200,
           url : Cypress.config('baseUrl') + "/category_parameter**",
           response : response ? response : res
-        });
+        }).as('initCategoryParameters');
     })
 }
 
@@ -77,6 +80,34 @@ function initAuditInfoMSO(response? : JSON, delay?: number, status?: number) : v
   })
 }
 
+function initAuditInfoMSOALaCarte(response? : JSON, delay?: number, status?: number) : void {
+  cy.readFile('../vid-automation/src/test/resources/a-la-carte/auditInfoMSOALaCarte.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        delay : delay ? delay : 0,
+        status : status ? status : 200,
+        url : Cypress.config('baseUrl') + "/asyncInstantiation/auditStatus/**/mso**",
+        response : response ? response : res
+      }).as('initAuditInfoMSOAlaCarte');
+  })
+}
+
+function initAsyncInstantiation(response? : JSON, delay?: number, status?: number) : void {
+  cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicAsyncInstantiation.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        delay : delay ? delay : 0,
+        status : status ? status : 200,
+        url : Cypress.config('baseUrl') + "/asyncInstantiation",
+        response : response ? response : res
+      }).as('initAsyncInstantiation');
+  })
+}
+
+
+
 function initVidMock(): void {
   initGetToMenuInfo();
   initCategoryParameter();
@@ -89,3 +120,6 @@ function initVidMock(): void {
 Cypress.Commands.add('initVidMock', initVidMock);
 Cypress.Commands.add('preventErrorsOnLoading', preventErrorsOnLoading);
 Cypress.Commands.add('initCategoryParameter', initCategoryParameter);
+Cypress.Commands.add('initAuditInfoMSO', initAuditInfoMSO);
+Cypress.Commands.add('initAuditInfoMSOALaCarte', initAuditInfoMSOALaCarte);
+Cypress.Commands.add('initAsyncInstantiation', initAsyncInstantiation);
index fa39436..796a914 100644 (file)
@@ -33,4 +33,41 @@ export class AsyncInstantiationModel{
   serviceModelName: string;
   serviceModelVersion: string;
   createdBulkDate: number;
+  action: string;
+
+  constructor(){
+    this.id = 0;
+    this.created = 0;
+    this.modified= 0;
+    this.createdId = '';
+    this.modifiedId = '';
+    this.rowNum = '';
+    this.auditUserId = '';
+    this.auditTrail = '';
+    this.jobId = '';
+    this.templateId = '';
+    this.userId = '';
+    this.jobStatus = '';
+    this.statusModifiedDate= 0 ;
+    this.hidden = false;
+    this.pause= false;
+    this.owningEntityId= '';
+    this.owningEntityName= '';
+    this.project= '';
+    this.aicZoneId= '';
+    this.aicZoneName= '';
+    this.tenantId= '';
+    this.tenantName= '';
+    this.regionId= '';
+    this.regionName= '';
+    this.serviceType= '';
+    this.subscriberName= '';
+    this.serviceInstanceId = 0;
+    this.serviceInstanceName= '';
+    this.serviceModelId= '';
+    this.serviceModelName= '';
+    this.serviceModelVersion= '';
+    this.createdBulkDate= 0;
+    this.action = '';
+  }
 }
index af12dfb..3c67112 100644 (file)
@@ -23,5 +23,19 @@ export class ServiceModel{
   vfModules: Object;
   volumeGroups: Object;
   pnfs:Object;
+  vnfGroups: Object;
+
+  constructor(){
+    this.service = <any>{};
+    this.vnfs = {};
+    this.networks= {};
+    this.collectionResource = {};
+    this.configurations = {};
+    this.serviceProxies = {};
+    this.vfModules = {};
+    this.volumeGroups = {};
+    this.pnfs = {};
+    this.vnfGroups = {};
+  }
 
 }
diff --git a/vid-webpack-master/cypress/support/steps/drawingBoard/drawingBoardComponentInfo.steps.ts b/vid-webpack-master/cypress/support/steps/drawingBoard/drawingBoardComponentInfo.steps.ts
new file mode 100644 (file)
index 0000000..2033f06
--- /dev/null
@@ -0,0 +1,22 @@
+declare namespace Cypress {
+  interface Chainable {
+    assertComponentInfoTitleLabelsAndValues: typeof assertComponentInfoTitleLabelsAndValues
+  }
+}
+
+
+
+function assertComponentInfoTitleLabelsAndValues(expectedTitle: string, labelsAndValues: string[][]) : void{
+  cy.getElementByDataTestsId('component-info-section-title').should('have.text', expectedTitle);
+  labelsAndValues.forEach((tuple: string[], index: number, array: string[][]) => {
+    let label = tuple[0];
+    let value = tuple[1];
+    cy.getElementByDataTestsId('model-item-label-' + label).should('have.text', label);
+    cy.getElementByDataTestsId('model-item-value-' + label).should('have.text', value);
+  });
+}
+
+
+
+
+Cypress.Commands.add('assertComponentInfoTitleLabelsAndValues', assertComponentInfoTitleLabelsAndValues);
diff --git a/vid-webpack-master/cypress/support/steps/drawingBoard/drawingBoardModel.steps.ts b/vid-webpack-master/cypress/support/steps/drawingBoard/drawingBoardModel.steps.ts
new file mode 100644 (file)
index 0000000..b2b48b2
--- /dev/null
@@ -0,0 +1,17 @@
+declare namespace Cypress {
+  interface Chainable {
+    drawingBoardPressAddButtonByElementName: typeof drawingBoardPressAddButtonByElementName,
+    drawingBoardNumberOfExistingElementsShouldContains: typeof drawingBoardNumberOfExistingElementsShouldContains
+  }
+}
+
+function drawingBoardPressAddButtonByElementName(elementName : string) : Chainable<any>  {
+  return cy.getElementByDataTestsId(elementName + '-add-btn');
+}
+
+function drawingBoardNumberOfExistingElementsShouldContains(expectedElements : number) : void   {
+  cy.getElementByDataTestsId('numberButton').contains(expectedElements);
+}
+
+Cypress.Commands.add('drawingBoardPressAddButtonByElementName', drawingBoardPressAddButtonByElementName);
+Cypress.Commands.add('drawingBoardNumberOfExistingElementsShouldContains', drawingBoardNumberOfExistingElementsShouldContains);
diff --git a/vid-webpack-master/cypress/support/steps/drawingBoard/drawingBoardTree.steps.ts b/vid-webpack-master/cypress/support/steps/drawingBoard/drawingBoardTree.steps.ts
new file mode 100644 (file)
index 0000000..0150b44
--- /dev/null
@@ -0,0 +1,27 @@
+declare namespace Cypress {
+  interface Chainable {
+    drawingBoardTreeOpenContextMenuByElementDataTestId: typeof drawingBoardTreeOpenContextMenuByElementDataTestId,
+    drawingBoardTreeClickOnContextMenuOptionByName: typeof drawingBoardTreeClickOnContextMenuOptionByName
+  }
+}
+
+function drawingBoardTreeOpenContextMenuByElementDataTestId(dataTestId : string, index ?: number) : Chainable<any>  {
+  return cy.getElementByDataTestsId(dataTestId + "-menu-btn").eq(index != null ? index : 0).click({force: true});
+}
+
+function drawingBoardTreeClickOnContextMenuOptionByName(optionName : string) : Chainable<any>  {
+  switch (optionName) {
+    case 'Duplicate':
+      return cy.getElementByDataTestsId('context-menu-duplicate').click({force : true});
+    case 'Remove':
+      return cy.getElementByDataTestsId('context-menu-remove').click({force : true});
+    case 'Edit':
+      return cy.getElementByDataTestsId('context-menu-edit').click({force : true});
+    default:
+      return cy.getElementByDataTestsId('context-menu-duplicate').click({force : true});
+  }
+}
+
+
+Cypress.Commands.add('drawingBoardTreeOpenContextMenuByElementDataTestId', drawingBoardTreeOpenContextMenuByElementDataTestId);
+Cypress.Commands.add('drawingBoardTreeClickOnContextMenuOptionByName', drawingBoardTreeClickOnContextMenuOptionByName);
diff --git a/vid-webpack-master/cypress/support/steps/drawingBoard/general.steps.ts b/vid-webpack-master/cypress/support/steps/drawingBoard/general.steps.ts
new file mode 100644 (file)
index 0000000..5444971
--- /dev/null
@@ -0,0 +1,33 @@
+declare namespace Cypress {
+  interface Chainable {
+    updateServiceShouldNotOverrideChild: typeof updateServiceShouldNotOverrideChild
+    openServiceContextMenu: typeof openServiceContextMenu
+  }
+}
+
+function updateServiceShouldNotOverrideChild() : void  {
+    cy.getElementByDataTestsId('drawing-board-tree').find('.node-content-wrapper').then((elements)=>{
+      let numberOfExistingElements = elements.length;
+        cy.openServiceContextMenu().then(() =>{
+          cy.getElementByDataTestsId('context-menu-header-edit-item').click({force : true}).then(()=>{
+            cy.genericFormSubmitForm().then(()=>{
+              cy.getElementByDataTestsId('drawing-board-tree').find('.node-content-wrapper').then((afterUpdateServiceElements)=>{
+                chai.expect(numberOfExistingElements).equal(afterUpdateServiceElements.length);
+              });
+            });
+          });
+        });
+    });
+
+}
+
+
+function openServiceContextMenu() :  Chainable<any> {
+ return cy.getElementByDataTestsId('openMenuBtn').click({force: true});
+}
+
+
+
+
+Cypress.Commands.add('updateServiceShouldNotOverrideChild', updateServiceShouldNotOverrideChild);
+Cypress.Commands.add('openServiceContextMenu', openServiceContextMenu);
diff --git a/vid-webpack-master/cypress/support/steps/fill.network.step.ts b/vid-webpack-master/cypress/support/steps/fill.network.step.ts
new file mode 100644 (file)
index 0000000..c981ac4
--- /dev/null
@@ -0,0 +1,19 @@
+// add new command to the existing Cypress interface
+declare namespace Cypress {
+  interface Chainable {
+    fillNetworkPopup: typeof fillNetworkPopup,
+  }
+}
+
+function fillNetworkPopup(): Chainable<any> {
+  cy.selectDropdownOptionByText('productFamily', 'Emanuel');
+  cy.selectDropdownOptionByText('lcpRegion', 'hvf6');
+  cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-STTest2');
+  cy.selectDropdownOptionByText('lineOfBusiness', 'zzz1');
+  cy.selectDropdownOptionByText('platform', 'xxx1');
+  return cy.getElementByDataTestsId('form-set').click({force : true}).then((done)=>{
+    return done;
+  });
+}
+
+Cypress.Commands.add('fillNetworkPopup', fillNetworkPopup);
diff --git a/vid-webpack-master/cypress/support/steps/fill.service.popup.step.ts b/vid-webpack-master/cypress/support/steps/fill.service.popup.step.ts
new file mode 100644 (file)
index 0000000..4595d89
--- /dev/null
@@ -0,0 +1,25 @@
+
+declare namespace Cypress {
+  interface Chainable {
+    fillServicePopup: typeof FillServicePopup
+  }
+}
+
+function FillServicePopup(): Chainable<any> {
+  cy.openIframe('/app/ui/#/servicePopup?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd&isCreate=true');
+  cy.selectDropdownOptionByText('subscriberName', 'SILVIA ROBBINS');
+  cy.selectDropdownOptionByText('serviceType', 'TYLER SILVIA');
+  cy.selectDropdownOptionByText('productFamily', 'TYLER SILVIA');
+  cy.selectDropdownOptionByText('lcpRegion', 'hvf6');
+  cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-testalexandria');
+  cy.selectDropdownOptionByText('aic_zone', 'NFTJSSSS-NFT1');
+  cy.selectDropdownOptionByText('project', 'WATKINS');
+  cy.selectDropdownOptionByText('owningEntity', 'aaa1');
+  cy.selectDropdownOptionByText('rollback', 'Rollback');
+  return cy.getElementByDataTestsId('form-set').click({force : true}).then((done)=>{
+    return done;
+  });
+
+}
+
+Cypress.Commands.add('fillServicePopup', FillServicePopup);
diff --git a/vid-webpack-master/cypress/support/steps/fill.vfModule.step.ts b/vid-webpack-master/cypress/support/steps/fill.vfModule.step.ts
new file mode 100644 (file)
index 0000000..d297783
--- /dev/null
@@ -0,0 +1,24 @@
+declare namespace Cypress {
+  interface Chainable {
+    fillVFModulePopup: typeof FillVFModulePopup
+  }
+}
+
+function FillVFModulePopup(vnfName: string, vfModuleName: string, instanceName: string, lcpRegion: string, tenant: string, rollback: boolean, sdncPreLoad: boolean): Chainable<any> {
+  cy.getElementByDataTestsId('node-' + vnfName).click({force: true});
+  cy.getElementByDataTestsId('node-' + vfModuleName + '-add-btn').click({force: true});
+  cy.getElementByDataTestsId('instanceName').last().type(instanceName, {force: true});
+  cy.getElementByDataTestsId('lcpRegion').last().select(lcpRegion);
+  cy.getElementByDataTestsId('tenant').last().select(tenant);
+  cy.getElementByDataTestsId('lcpRegion').last().select(lcpRegion);
+  cy.getElementByDataTestsId('rollback').last().select(String(rollback));
+  if (sdncPreLoad) {
+    cy.getElementByDataTestsId('sdncPreLoad').last().check();
+  }
+  return cy.getElementByDataTestsId('form-set').last().click({force: true}).then((done) => {
+    return done;
+  });
+
+}
+
+Cypress.Commands.add('fillVFModulePopup', FillVFModulePopup);
diff --git a/vid-webpack-master/cypress/support/steps/fill.vnf.popup.step.ts b/vid-webpack-master/cypress/support/steps/fill.vnf.popup.step.ts
new file mode 100644 (file)
index 0000000..a5319b8
--- /dev/null
@@ -0,0 +1,30 @@
+// add new command to the existing Cypress interface
+
+
+declare namespace Cypress {
+  interface Chainable {
+    fillVnfPopup: typeof FillVnfPopup,
+    duplicateVnf: typeof DuplicateVnf,
+  }
+}
+function FillVnfPopup(): Chainable<any> {
+  cy.selectDropdownOptionByText('productFamily', 'Emanuel');
+  cy.selectDropdownOptionByText('lcpRegion', 'hvf6');
+  cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-STTest2');
+  cy.selectDropdownOptionByText('lineOfBusiness', 'zzz1');
+  cy.selectDropdownOptionByText('platform', 'xxx1');
+  return cy.getElementByDataTestsId('form-set').click({force : true}).then((done)=>{
+    return done;
+  });
+}
+function DuplicateVnf( vnfNode: string, amountBefore: number): Chainable<any> {
+  return cy.getElementByDataTestsId(vnfNode).should('have.length', amountBefore)
+    .getElementByDataTestsId(vnfNode+"-menu-btn").click({force:true})
+    .getElementByDataTestsId('context-menu-duplicate').click({force : true})
+    .getTagElementContainsText('button','Duplicate').click({force:true})
+    .getElementByDataTestsId(vnfNode).should('have.length', amountBefore+1).then((done)=>{
+      return done;
+    });
+}
+Cypress.Commands.add('fillVnfPopup', FillVnfPopup);
+Cypress.Commands.add('duplicateVnf', DuplicateVnf);
diff --git a/vid-webpack-master/cypress/support/steps/general/clickOutside.step.ts b/vid-webpack-master/cypress/support/steps/general/clickOutside.step.ts
new file mode 100644 (file)
index 0000000..e3323a1
--- /dev/null
@@ -0,0 +1,14 @@
+declare namespace Cypress {
+  interface Chainable {
+    clickOutside: typeof clickOutside,
+  }
+}
+
+function clickOutside(testByIdClickElement : string, testBeforeClickOutside : Function, testAfterClickOutside : Function) {
+  testBeforeClickOutside();
+  cy.getElementByDataTestsId(testByIdClickElement).click({force: true}).then(()=>{
+    testAfterClickOutside();
+  });
+}
+
+Cypress.Commands.add('clickOutside', clickOutside);
diff --git a/vid-webpack-master/cypress/support/steps/general/compareDeepObjects.step.ts b/vid-webpack-master/cypress/support/steps/general/compareDeepObjects.step.ts
new file mode 100644 (file)
index 0000000..ee5e95a
--- /dev/null
@@ -0,0 +1,32 @@
+const { _ } = Cypress;
+
+declare namespace Cypress {
+  interface Chainable {
+    deepCompare: typeof deepCompare,
+  }
+}
+
+function deepCompare(actual : any, expected : any) {
+  if(actual !== null && expected !== null){
+    let diff : any[] = [];
+    Cypress._.mergeWith(actual, expected, function (objectValue, sourceValue, key, object, source) {
+      if ( !(_.isEqual(objectValue, sourceValue)) && (Object(objectValue) !== objectValue)) {
+        diff.push("key: " +key + ", expected: " + sourceValue + ", actual: " + objectValue);
+      }
+    });
+
+    Cypress._.mergeWith(expected, actual, function (objectValue, sourceValue, key, object, source) {
+      if ( !(_.isEqual(objectValue, sourceValue)) && (Object(objectValue) !== objectValue)) {
+        diff.push("key: " +key + ", expected: " + sourceValue + ", actual: " + objectValue);
+      }
+    });
+
+    if(diff.length > 0){
+      console.error("diff", diff);
+      cy.log("The object are not equals", diff);
+      expect(actual).equals(expected);
+    }
+  }
+}
+
+Cypress.Commands.add('deepCompare', deepCompare);
diff --git a/vid-webpack-master/cypress/support/steps/genericForm/checkPopover.step.ts b/vid-webpack-master/cypress/support/steps/genericForm/checkPopover.step.ts
new file mode 100644 (file)
index 0000000..085410e
--- /dev/null
@@ -0,0 +1,14 @@
+declare namespace Cypress {
+  interface Chainable {
+    checkPopoverContentOnMouseEvent: typeof checkPopoverContentOnMouseEvent
+  }
+}
+
+function checkPopoverContentOnMouseEvent(dataTestId: string, klass: string, mouseEvent: string, index: number) : Chainable<any> {
+  index = index || 0;
+  let element = cy.getElementByDataTestsId(dataTestId).eq(index);
+  element.trigger(mouseEvent).click().get(klass);
+  return element;
+}
+
+Cypress.Commands.add('checkPopoverContentOnMouseEvent', checkPopoverContentOnMouseEvent);
diff --git a/vid-webpack-master/cypress/support/steps/genericForm/genericFormAction.steps.ts b/vid-webpack-master/cypress/support/steps/genericForm/genericFormAction.steps.ts
new file mode 100644 (file)
index 0000000..9786369
--- /dev/null
@@ -0,0 +1,12 @@
+declare namespace Cypress {
+  interface Chainable {
+    genericFormSubmitForm: typeof genericFormSubmitForm
+  }
+}
+
+function genericFormSubmitForm() : Chainable<any>  {
+  return  cy.getElementByDataTestsId('form-set').click({force: true});
+}
+
+
+Cypress.Commands.add('genericFormSubmitForm', genericFormSubmitForm);
index f35e6e6..a7ed075 100644 (file)
@@ -32,7 +32,6 @@ function login(): void {
       currentLoginCookies = res;
     });
   }
-
 }
 
 function openIframe(iframeUrl : string): void {
diff --git a/vid-webpack-master/cypress/support/steps/menu.step.ts b/vid-webpack-master/cypress/support/steps/menu.step.ts
new file mode 100644 (file)
index 0000000..a0bfdb6
--- /dev/null
@@ -0,0 +1,19 @@
+declare namespace Cypress {
+  interface Chainable {
+    assertMenuItemsForNode: typeof assertMenuItemsForNode
+  }
+}
+ function assertMenuItemsForNode(enabledActions: string[], nodeName: string, index: number = 0) : Chainable<any> {
+  let node = cy.getElementByDataTestsId(nodeName).eq(+index);
+  node.trigger('mouseover').click().then(()=> {
+
+    //waiting to the menu to appear to catch options that shall not exist but actually exist
+    cy.get('.ngx-contextmenu').should('exist').then(()=> {
+      for (let option of ['duplicate', 'showAuditInfo', 'addGroupMember', 'delete', 'undoDelete', 'remove', ...enabledActions]) {
+        cy.getElementByDataTestsId(`context-menu-${option}`).should(enabledActions.some(s => s === option) ? 'exist' : 'not.exist');
+    }});
+  });
+  return node;
+}
+
+Cypress.Commands.add('assertMenuItemsForNode', assertMenuItemsForNode);
diff --git a/vid-webpack-master/cypress/support/steps/openInstanceAuditInfoModal.step.ts b/vid-webpack-master/cypress/support/steps/openInstanceAuditInfoModal.step.ts
new file mode 100644 (file)
index 0000000..7fc50c1
--- /dev/null
@@ -0,0 +1,18 @@
+declare namespace Cypress {
+  interface Chainable {
+    openInstanceAuditInfoModal: typeof openInstanceAuditInfoModal,
+  }
+}
+
+function openInstanceAuditInfoModal(iconTextId: string): void {
+  cy.getElementByDataTestsId(iconTextId).click({force: true})
+     .getElementByDataTestsId('context-menu-showAuditInfo').click({force : true})
+     .getElementByDataTestsId('audit-info-title').contains('Instantiation Information');
+     cy.get('.table-title').contains('MSO status');
+     cy.get('#cancelButton').click({force: true})
+
+}
+
+
+Cypress.Commands.add('openInstanceAuditInfoModal', openInstanceAuditInfoModal);
+
diff --git a/vid-webpack-master/karma.conf.js b/vid-webpack-master/karma.conf.js
deleted file mode 100644 (file)
index 6c05760..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-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
-  });
-}
index 2e2adc0..21ec61c 100644 (file)
   "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==",
+    "@angular-builders/jest": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/@angular-builders/jest/-/jest-7.1.2.tgz",
+      "integrity": "sha512-xscNy9w86kw/NJADAiRcEIASxb7Pxp6GYbEh3nlN6wVUKPSn9k9H08Z3UCoCM6h/UvJIg1JN1eXfyV6OeppF8Q==",
       "dev": true,
       "requires": {
-        "loader-utils": "1.1.0",
-        "source-map": "0.5.7",
-        "typescript": "2.6.2",
-        "webpack-sources": "1.1.0"
+        "jest-preset-angular": "^6.0.0",
+        "lodash": "^4.17.10"
       },
       "dependencies": {
-        "typescript": {
-          "version": "2.6.2",
-          "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
-          "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
           "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==",
+    "@angular-devkit/architect": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.11.4.tgz",
+      "integrity": "sha512-2zi6S9tPlk52vyqN67IvFoeNgd0uxtrPlwl3TdvJ3wrH7sYGJnkQ+EzAE7cKUGWAV989BbNtx2YxhRDHnN21Fg==",
       "dev": true,
       "requires": {
-        "ajv": "5.5.2",
-        "chokidar": "1.7.0",
-        "rxjs": "5.5.6",
-        "source-map": "0.5.7"
+        "@angular-devkit/core": "7.1.4",
+        "rxjs": "6.3.3"
       },
       "dependencies": {
-        "ajv": {
-          "version": "5.5.2",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
           "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"
+            "tslib": "^1.9.0"
           }
         }
       }
     },
-    "@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",
+    "@angular-devkit/build-angular": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.11.4.tgz",
+      "integrity": "sha512-5WQAQB4heDqAotqjU3Tl8Ons0S/e16dKwVkQFdqfKPyBgmu4CyUH35eTV+i6i7un1Elg65U5GnA4MiUtApqVyw==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/architect": "0.11.4",
+        "@angular-devkit/build-optimizer": "0.11.4",
+        "@angular-devkit/build-webpack": "0.11.4",
+        "@angular-devkit/core": "7.1.4",
+        "@ngtools/webpack": "7.1.4",
+        "ajv": "6.5.3",
+        "autoprefixer": "9.3.1",
+        "circular-dependency-plugin": "5.0.2",
+        "clean-css": "4.2.1",
+        "copy-webpack-plugin": "4.5.4",
+        "file-loader": "2.0.0",
+        "glob": "7.1.3",
+        "istanbul": "0.4.5",
+        "istanbul-instrumenter-loader": "3.0.1",
+        "karma-source-map-support": "1.3.0",
+        "less": "3.8.1",
         "less-loader": "4.1.0",
-        "license-webpack-plugin": "1.3.0",
+        "license-webpack-plugin": "2.0.2",
         "loader-utils": "1.1.0",
-        "lodash": "4.17.5",
-        "memory-fs": "0.4.1",
+        "mini-css-extract-plugin": "0.4.4",
         "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",
+        "node-sass": "4.10.0",
+        "opn": "5.3.0",
+        "parse5": "4.0.0",
+        "portfinder": "1.0.17",
+        "postcss": "7.0.5",
+        "postcss-import": "12.0.0",
+        "postcss-loader": "3.0.0",
         "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",
+        "rxjs": "6.3.3",
+        "sass-loader": "7.1.0",
+        "semver": "5.5.1",
+        "source-map-loader": "0.2.4",
+        "source-map-support": "0.5.9",
+        "speed-measure-webpack-plugin": "1.2.3",
+        "stats-webpack-plugin": "0.7.0",
+        "style-loader": "0.23.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"
+        "terser-webpack-plugin": "1.1.0",
+        "tree-kill": "1.2.0",
+        "webpack": "4.23.1",
+        "webpack-dev-middleware": "3.4.0",
+        "webpack-dev-server": "3.1.10",
+        "webpack-merge": "4.1.4",
+        "webpack-sources": "1.3.0",
+        "webpack-subresource-integrity": "1.1.0-rc.6"
       },
       "dependencies": {
-        "chalk": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
-          "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+        "@webassemblyjs/ast": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.10.tgz",
+          "integrity": "sha512-wTUeaByYN2EA6qVqhbgavtGc7fLTOx0glG2IBsFlrFG51uXIGlYBTyIZMf4SPLo3v1bgV/7lBN3l7Z0R6Hswew==",
           "dev": true,
           "requires": {
-            "ansi-styles": "3.2.1",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "4.5.0"
+            "@webassemblyjs/helper-module-context": "1.7.10",
+            "@webassemblyjs/helper-wasm-bytecode": "1.7.10",
+            "@webassemblyjs/wast-parser": "1.7.10"
           }
         },
-        "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"
-          }
+        "@webassemblyjs/floating-point-hex-parser": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz",
+          "integrity": "sha512-gMsGbI6I3p/P1xL2UxqhNh1ga2HCsx5VBB2i5VvJFAaqAjd2PBTRULc3BpTydabUQEGlaZCzEUQhLoLG7TvEYQ==",
+          "dev": true
         },
-        "shelljs": {
-          "version": "0.8.0",
-          "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.0.tgz",
-          "integrity": "sha512-wb72o5SM27oFRq2mMeNSl70DVkkvwf3ZSgk9rvieRVz7xFMIQp02HYw0oxlZgeAWS+wzGB+jcJWQTF7hH9WIPg==",
+        "@webassemblyjs/helper-api-error": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz",
+          "integrity": "sha512-DoYRlPWtuw3yd5BOr9XhtrmB6X1enYF0/54yNvQWGXZEPDF5PJVNI7zQ7gkcKfTESzp8bIBWailaFXEK/jjCsw==",
+          "dev": true
+        },
+        "@webassemblyjs/helper-buffer": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz",
+          "integrity": "sha512-+RMU3dt/dPh4EpVX4u5jxsOlw22tp3zjqE0m3ftU2tsYxnPULb4cyHlgaNd2KoWuwasCQqn8Mhr+TTdbtj3LlA==",
+          "dev": true
+        },
+        "@webassemblyjs/helper-code-frame": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz",
+          "integrity": "sha512-UiytbpKAULOEab2hUZK2ywXen4gWJVrgxtwY3Kn+eZaaSWaRM8z/7dAXRSoamhKFiBh1uaqxzE/XD9BLlug3gw==",
           "dev": true,
           "requires": {
-            "glob": "7.1.2",
-            "interpret": "1.1.0",
-            "rechoir": "0.6.2"
+            "@webassemblyjs/wast-printer": "1.7.10"
           }
-        }
-      }
-    },
-    "@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=",
+        },
+        "@webassemblyjs/helper-fsm": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz",
+          "integrity": "sha512-w2vDtUK9xeSRtt5+RnnlRCI7wHEvLjF0XdnxJpgx+LJOvklTZPqWkuy/NhwHSLP19sm9H8dWxKeReMR7sCkGZA==",
           "dev": true
         },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+        "@webassemblyjs/helper-module-context": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz",
+          "integrity": "sha512-yE5x/LzZ3XdPdREmJijxzfrf+BDRewvO0zl8kvORgSWmxpRrkqY39KZSq6TSgIWBxkK4SrzlS3BsMCv2s1FpsQ==",
+          "dev": true
+        },
+        "@webassemblyjs/helper-wasm-bytecode": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz",
+          "integrity": "sha512-u5qy4SJ/OrxKxZqJ9N3qH4ZQgHaAzsopsYwLvoWJY6Q33r8PhT3VPyNMaJ7ZFoqzBnZlCcS/0f4Sp8WBxylXfg==",
+          "dev": true
+        },
+        "@webassemblyjs/helper-wasm-section": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz",
+          "integrity": "sha512-Ecvww6sCkcjatcyctUrn22neSJHLN/TTzolMGG/N7S9rpbsTZ8c6Bl98GpSpV77EvzNijiNRHBG0+JO99qKz6g==",
           "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"
+            "@webassemblyjs/ast": "1.7.10",
+            "@webassemblyjs/helper-buffer": "1.7.10",
+            "@webassemblyjs/helper-wasm-bytecode": "1.7.10",
+            "@webassemblyjs/wasm-gen": "1.7.10"
           }
         },
-        "cli-cursor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
-          "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+        "@webassemblyjs/ieee754": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz",
+          "integrity": "sha512-HRcWcY+YWt4+s/CvQn+vnSPfRaD4KkuzQFt5MNaELXXHSjelHlSEA8ZcqT69q0GTIuLWZ6JaoKar4yWHVpZHsQ==",
           "dev": true,
           "requires": {
-            "restore-cursor": "1.0.1"
+            "@xtuc/ieee754": "^1.2.0"
           }
         },
-        "figures": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
-          "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+        "@webassemblyjs/leb128": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.10.tgz",
+          "integrity": "sha512-og8MciYlA8hvzCLR71hCuZKPbVBfLQeHv7ImKZ4nlyxrYbG7uJHYtHiHu6OV9SqrGuD03H/HtXC4Bgdjfm9FHw==",
           "dev": true,
           "requires": {
-            "escape-string-regexp": "1.0.5",
-            "object-assign": "4.1.1"
+            "@xtuc/long": "4.2.1"
           }
         },
-        "onetime": {
-          "version": "1.1.0",
-          "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
-          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+        "@webassemblyjs/utf8": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.10.tgz",
+          "integrity": "sha512-Ng6Pxv6siyZp635xCSnH3mKmIFgqWPCcGdoo0GBYgyGdxu7cUj4agV7Uu1a8REP66UYUFXJLudeGgd4RvuJAnQ==",
           "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=",
+        "@webassemblyjs/wasm-edit": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz",
+          "integrity": "sha512-e9RZFQlb+ZuYcKRcW9yl+mqX/Ycj9+3/+ppDI8nEE/NCY6FoK8f3dKBcfubYV/HZn44b+ND4hjh+4BYBt+sDnA==",
           "dev": true,
           "requires": {
-            "exit-hook": "1.1.1",
-            "onetime": "1.1.0"
+            "@webassemblyjs/ast": "1.7.10",
+            "@webassemblyjs/helper-buffer": "1.7.10",
+            "@webassemblyjs/helper-wasm-bytecode": "1.7.10",
+            "@webassemblyjs/helper-wasm-section": "1.7.10",
+            "@webassemblyjs/wasm-gen": "1.7.10",
+            "@webassemblyjs/wasm-opt": "1.7.10",
+            "@webassemblyjs/wasm-parser": "1.7.10",
+            "@webassemblyjs/wast-printer": "1.7.10"
           }
         },
-        "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=",
+        "@webassemblyjs/wasm-gen": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz",
+          "integrity": "sha512-M0lb6cO2Y0PzDye/L39PqwV+jvO+2YxEG5ax+7dgq7EwXdAlpOMx1jxyXJTScQoeTpzOPIb+fLgX/IkLF8h2yw==",
           "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"
+            "@webassemblyjs/ast": "1.7.10",
+            "@webassemblyjs/helper-wasm-bytecode": "1.7.10",
+            "@webassemblyjs/ieee754": "1.7.10",
+            "@webassemblyjs/leb128": "1.7.10",
+            "@webassemblyjs/utf8": "1.7.10"
           }
         },
-        "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==",
+        "@webassemblyjs/wasm-opt": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz",
+          "integrity": "sha512-R66IHGCdicgF5ZliN10yn5HaC7vwYAqrSVJGjtJJQp5+QNPBye6heWdVH/at40uh0uoaDN/UVUfXK0gvuUqtVg==",
           "dev": true,
           "requires": {
-            "find-cache-dir": "1.0.0",
-            "loader-utils": "1.1.0",
-            "mkdirp": "0.5.1"
+            "@webassemblyjs/ast": "1.7.10",
+            "@webassemblyjs/helper-buffer": "1.7.10",
+            "@webassemblyjs/wasm-gen": "1.7.10",
+            "@webassemblyjs/wasm-parser": "1.7.10"
           }
         },
-        "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==",
+        "@webassemblyjs/wasm-parser": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz",
+          "integrity": "sha512-AEv8mkXVK63n/iDR3T693EzoGPnNAwKwT3iHmKJNBrrALAhhEjuPzo/lTE4U7LquEwyvg5nneSNdTdgrBaGJcA==",
           "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"
+            "@webassemblyjs/ast": "1.7.10",
+            "@webassemblyjs/helper-api-error": "1.7.10",
+            "@webassemblyjs/helper-wasm-bytecode": "1.7.10",
+            "@webassemblyjs/ieee754": "1.7.10",
+            "@webassemblyjs/leb128": "1.7.10",
+            "@webassemblyjs/utf8": "1.7.10"
           }
         },
-        "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=",
+        "@webassemblyjs/wast-parser": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz",
+          "integrity": "sha512-YTPEtOBljkCL0VjDp4sHe22dAYSm3ZwdJ9+2NTGdtC7ayNvuip1wAhaAS8Zt9Q6SW9E5Jf5PX7YE3XWlrzR9cw==",
           "dev": true,
           "requires": {
-            "center-align": "0.1.3",
-            "right-align": "0.1.3",
-            "wordwrap": "0.0.2"
+            "@webassemblyjs/ast": "1.7.10",
+            "@webassemblyjs/floating-point-hex-parser": "1.7.10",
+            "@webassemblyjs/helper-api-error": "1.7.10",
+            "@webassemblyjs/helper-code-frame": "1.7.10",
+            "@webassemblyjs/helper-fsm": "1.7.10",
+            "@xtuc/long": "4.2.1"
           }
         },
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+        "@webassemblyjs/wast-printer": {
+          "version": "1.7.10",
+          "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz",
+          "integrity": "sha512-mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA==",
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "@webassemblyjs/ast": "1.7.10",
+            "@webassemblyjs/wast-parser": "1.7.10",
+            "@xtuc/long": "4.2.1"
           }
         },
-        "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"
-          }
+        "acorn": {
+          "version": "5.7.3",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
+          "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
+          "dev": true
         },
-        "os-locale": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
-          "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+        "acorn-dynamic-import": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
+          "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
           "dev": true,
           "requires": {
-            "execa": "0.7.0",
-            "lcid": "1.0.0",
-            "mem": "1.1.0"
+            "acorn": "^5.0.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"
-          }
+        "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
         },
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+        "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
         },
-        "read-pkg": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
-          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
           "dev": true,
           "requires": {
-            "load-json-file": "2.0.0",
-            "normalize-package-data": "2.4.0",
-            "path-type": "2.0.0"
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.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.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=",
+        "enhanced-resolve": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
+          "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
           "dev": true,
           "requires": {
-            "find-up": "2.1.0",
-            "read-pkg": "2.0.0"
+            "graceful-fs": "^4.1.2",
+            "memory-fs": "^0.4.0",
+            "tapable": "^1.0.0"
           }
         },
-        "string-width": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+        "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": {
-            "is-fullwidth-code-point": "2.0.0",
-            "strip-ansi": "4.0.0"
+            "debug": "^2.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
           },
           "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
+            "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.0"
+              }
             },
-            "strip-ansi": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+            "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": {
-                "ansi-regex": "3.0.0"
+                "is-extendable": "^0.1.0"
               }
+            },
+            "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.0.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
             }
           }
         },
-        "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=",
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
           "dev": true,
           "requires": {
-            "source-map": "0.5.7",
-            "uglify-to-browserify": "1.0.2",
-            "yargs": "3.10.0"
+            "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
           },
           "dependencies": {
-            "yargs": {
-              "version": "3.10.0",
-              "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
-              "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+            "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": {
-                "camelcase": "1.2.1",
-                "cliui": "2.1.0",
-                "decamelize": "1.2.0",
-                "window-size": "0.1.0"
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "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.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=",
+        "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": {
-            "source-map": "0.5.7",
-            "uglify-js": "2.8.29",
-            "webpack-sources": "1.1.0"
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.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=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
           }
         },
-        "webpack": {
-          "version": "3.6.0",
-          "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.6.0.tgz",
-          "integrity": "sha512-OsHT3D0W0KmPPh60tC7asNnOmST6bKTiR90UyEdT9QYoaJ4OYN4Gg7WK1k3VxHK07ZoiYWPsKvlS/gAjwL/vRA==",
+        "glob": {
+          "version": "7.1.3",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+          "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
           "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"
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
         },
-        "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
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.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.5"
+              }
+            }
+          }
         },
-        "yargs": {
-          "version": "8.0.2",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
-          "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
           "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"
+            "kind-of": "^3.0.2"
           },
           "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=",
+            "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": {
-                "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"
-                  }
-                }
+                "is-buffer": "^1.1.5"
               }
             }
           }
         },
-        "yargs-parser": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
-          "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+        "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": {
-            "camelcase": "4.1.0"
+            "kind-of": "^3.0.2"
           },
           "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
+            "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.5"
+              }
             }
           }
-        }
-      }
-    },
-    "@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=",
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
           "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==",
+        },
+        "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.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "parse5": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+          "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+          "dev": true
+        },
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
           "requires": {
-            "ansi-styles": "3.2.1",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "5.3.0"
+            "tslib": "^1.9.0"
           }
         },
-        "events": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/events/-/events-2.0.0.tgz",
-          "integrity": "sha512-r/M5YkNg9zwI8QbSf7tsDWWJvO3PGwZXyG7GpFAxtMASnHL2eblFd7iHiGPtyGKKFPZ59S63NeX10Ws6WqGDcg=="
+        "schema-utils": {
+          "version": "0.4.7",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
+          "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-keywords": "^3.1.0"
+          }
         },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+        "semver": {
+          "version": "5.5.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
+          "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
+          "dev": true
         },
-        "qs": {
-          "version": "6.5.1",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
-          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
+        "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
         },
-        "style-loader": {
-          "version": "0.20.3",
-          "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.20.3.tgz",
-          "integrity": "sha512-2I7AVP73MvK33U7B9TKlYZAqdROyMXDYSMvHLX43qy3GCOaJNiV6i0v/sv9idWIaQ42Yn2dNv79Q5mKXbKhAZg==",
+        "source-map-support": {
+          "version": "0.5.9",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
+          "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
+          "dev": true,
           "requires": {
-            "loader-utils": "1.1.0",
-            "schema-utils": "0.4.5"
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.0"
           }
         },
-        "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==",
+        "tapable": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz",
+          "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==",
+          "dev": true
+        },
+        "webpack": {
+          "version": "4.23.1",
+          "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.23.1.tgz",
+          "integrity": "sha512-iE5Cu4rGEDk7ONRjisTOjVHv3dDtcFfwitSxT7evtYj/rANJpt1OuC/Kozh1pBa99AUBr1L/LsaNB+D9Xz3CEg==",
+          "dev": true,
+          "requires": {
+            "@webassemblyjs/ast": "1.7.10",
+            "@webassemblyjs/helper-module-context": "1.7.10",
+            "@webassemblyjs/wasm-edit": "1.7.10",
+            "@webassemblyjs/wasm-parser": "1.7.10",
+            "acorn": "^5.6.2",
+            "acorn-dynamic-import": "^3.0.0",
+            "ajv": "^6.1.0",
+            "ajv-keywords": "^3.1.0",
+            "chrome-trace-event": "^1.0.0",
+            "enhanced-resolve": "^4.1.0",
+            "eslint-scope": "^4.0.0",
+            "json-parse-better-errors": "^1.0.2",
+            "loader-runner": "^2.3.0",
+            "loader-utils": "^1.1.0",
+            "memory-fs": "~0.4.1",
+            "micromatch": "^3.1.8",
+            "mkdirp": "~0.5.0",
+            "neo-async": "^2.5.0",
+            "node-libs-browser": "^2.0.0",
+            "schema-utils": "^0.4.4",
+            "tapable": "^1.1.0",
+            "uglifyjs-webpack-plugin": "^1.2.4",
+            "watchpack": "^1.5.0",
+            "webpack-sources": "^1.3.0"
+          }
+        },
+        "webpack-sources": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
+          "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
+          "dev": true,
           "requires": {
-            "has-flag": "3.0.0"
+            "source-list-map": "^2.0.0",
+            "source-map": "~0.6.1"
           }
         }
       }
     },
-    "@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==",
+    "@angular-devkit/build-optimizer": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.11.4.tgz",
+      "integrity": "sha512-tAAWWFCcl918Q1JivlLvLFer8Qm4/THWbEneMwk5fQvG6/NgJLoa3itP/MCUq4qL6YHmp2DWkdWnWfRQCgHeFA==",
+      "dev": true,
       "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"
+        "loader-utils": "1.1.0",
+        "source-map": "0.5.6",
+        "typescript": "3.1.6",
+        "webpack-sources": "1.2.0"
       },
       "dependencies": {
-        "core-js": {
-          "version": "2.5.5",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
-          "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs="
+        "source-map": {
+          "version": "0.5.6",
+          "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+          "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
+          "dev": true
+        },
+        "typescript": {
+          "version": "3.1.6",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz",
+          "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==",
+          "dev": true
+        },
+        "webpack-sources": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz",
+          "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==",
+          "dev": true,
+          "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==",
+              "dev": true
+            }
+          }
         }
       }
     },
-    "@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==",
+    "@angular-devkit/build-webpack": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.11.4.tgz",
+      "integrity": "sha512-4nEDXSbv3oDu27Rw5s2DMKmcOZYVAt76bryVF2SycSkDq3eAIiqmgw3G3CJJ4LTulXzDpaIpk02MvgbYkX+hvw==",
+      "dev": true,
       "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"
+        "@angular-devkit/architect": "0.11.4",
+        "@angular-devkit/core": "7.1.4",
+        "rxjs": "6.3.3"
       },
       "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=="
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
         }
       }
     },
-    "@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==",
+    "@angular-devkit/core": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.4.tgz",
+      "integrity": "sha512-3cBVHjSQjMyE/mIyOX82ekdybNRQlN+kUfmdZS6oVW9aV48vdxcVbEGdl8t1H4enMf89u8kXiAAET9jFaqWopg==",
       "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"
+        "ajv": "6.5.3",
+        "chokidar": "2.0.4",
+        "fast-json-stable-stringify": "2.0.0",
+        "rxjs": "6.3.3",
+        "source-map": "0.7.3"
       },
       "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=",
+        "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.4",
+            "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
-        }
-      }
-    },
-    "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=",
+        },
+        "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.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
           "dev": true,
-          "optional": true
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.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.0"
+              }
+            }
+          }
         },
-        "readable-stream": {
-          "version": "1.1.14",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+        "chokidar": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+          "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
           "dev": true,
-          "optional": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "0.0.1",
-            "string_decoder": "0.10.31"
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.0",
+            "braces": "^2.3.0",
+            "fsevents": "^1.2.2",
+            "glob-parent": "^3.1.0",
+            "inherits": "^2.0.1",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "lodash.debounce": "^4.0.8",
+            "normalize-path": "^2.1.1",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.0.0",
+            "upath": "^1.0.5"
           }
         },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+        "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,
-          "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="
+          "requires": {
+            "debug": "^2.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "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.0"
+              }
+            },
+            "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.0.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
+            }
+          }
         },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "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"
+            "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "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.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": {
+        "fill-range": {
           "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz",
-          "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
           "requires": {
-            "is-directory": "0.3.1",
-            "js-yaml": "3.11.0",
-            "parse-json": "4.0.0",
-            "require-from-string": "2.0.2"
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.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=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
           }
         },
-        "parse-json": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
-          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+        "fsevents": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
+          "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
+          "dev": true,
+          "optional": true,
           "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",
+            "nan": "^2.9.2",
+            "node-pre-gyp": "^0.10.0"
+          },
+          "dependencies": {
+            "abbrev": {
+              "version": "1.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "ansi-regex": {
+              "version": "2.1.1",
+              "bundled": true,
+              "dev": true
+            },
+            "aproba": {
+              "version": "1.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "are-we-there-yet": {
+              "version": "1.1.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "delegates": "^1.0.0",
+                "readable-stream": "^2.0.6"
+              }
+            },
+            "balanced-match": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true
+            },
+            "brace-expansion": {
+              "version": "1.1.11",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+              }
+            },
+            "chownr": {
+              "version": "1.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "code-point-at": {
+              "version": "1.1.0",
+              "bundled": true,
+              "dev": true
+            },
+            "concat-map": {
+              "version": "0.0.1",
+              "bundled": true,
+              "dev": true
+            },
+            "console-control-strings": {
+              "version": "1.1.0",
+              "bundled": true,
+              "dev": true
+            },
+            "core-util-is": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "debug": {
+              "version": "2.6.9",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ms": "2.0.0"
+              }
+            },
+            "deep-extend": {
+              "version": "0.5.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "delegates": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "detect-libc": {
+              "version": "1.0.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "fs-minipass": {
+              "version": "1.2.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minipass": "^2.2.1"
+              }
+            },
+            "fs.realpath": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "gauge": {
+              "version": "2.7.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "aproba": "^1.0.3",
+                "console-control-strings": "^1.0.0",
+                "has-unicode": "^2.0.0",
+                "object-assign": "^4.1.0",
+                "signal-exit": "^3.0.0",
+                "string-width": "^1.0.1",
+                "strip-ansi": "^3.0.1",
+                "wide-align": "^1.1.0"
+              }
+            },
+            "glob": {
+              "version": "7.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.0.4",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+              }
+            },
+            "has-unicode": {
+              "version": "2.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "iconv-lite": {
+              "version": "0.4.21",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "safer-buffer": "^2.1.0"
+              }
+            },
+            "ignore-walk": {
+              "version": "3.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minimatch": "^3.0.4"
+              }
+            },
+            "inflight": {
+              "version": "1.0.6",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "once": "^1.3.0",
+                "wrappy": "1"
+              }
+            },
+            "inherits": {
+              "version": "2.0.3",
+              "bundled": true,
+              "dev": true
+            },
+            "ini": {
+              "version": "1.3.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "is-fullwidth-code-point": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "number-is-nan": "^1.0.0"
+              }
+            },
+            "isarray": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "minimatch": {
+              "version": "3.0.4",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "brace-expansion": "^1.1.7"
+              }
+            },
+            "minimist": {
+              "version": "0.0.8",
+              "bundled": true,
+              "dev": true
+            },
+            "minipass": {
+              "version": "2.2.4",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "safe-buffer": "^5.1.1",
+                "yallist": "^3.0.0"
+              }
+            },
+            "minizlib": {
+              "version": "1.1.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minipass": "^2.2.1"
+              }
+            },
+            "mkdirp": {
+              "version": "0.5.1",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "minimist": "0.0.8"
+              }
+            },
+            "ms": {
+              "version": "2.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "needle": {
+              "version": "2.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "debug": "^2.1.2",
+                "iconv-lite": "^0.4.4",
+                "sax": "^1.2.4"
+              }
+            },
+            "node-pre-gyp": {
+              "version": "0.10.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "detect-libc": "^1.0.2",
+                "mkdirp": "^0.5.1",
+                "needle": "^2.2.0",
+                "nopt": "^4.0.1",
+                "npm-packlist": "^1.1.6",
+                "npmlog": "^4.0.2",
+                "rc": "^1.1.7",
+                "rimraf": "^2.6.1",
+                "semver": "^5.3.0",
+                "tar": "^4"
+              }
+            },
+            "nopt": {
+              "version": "4.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "abbrev": "1",
+                "osenv": "^0.1.4"
+              }
+            },
+            "npm-bundled": {
+              "version": "1.0.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "npm-packlist": {
+              "version": "1.1.10",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ignore-walk": "^3.0.1",
+                "npm-bundled": "^1.0.1"
+              }
+            },
+            "npmlog": {
+              "version": "4.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "are-we-there-yet": "~1.1.2",
+                "console-control-strings": "~1.1.0",
+                "gauge": "~2.7.3",
+                "set-blocking": "~2.0.0"
+              }
+            },
+            "number-is-nan": {
+              "version": "1.0.1",
+              "bundled": true,
+              "dev": true
+            },
+            "object-assign": {
+              "version": "4.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "once": {
+              "version": "1.4.0",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "wrappy": "1"
+              }
+            },
+            "os-homedir": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "os-tmpdir": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "osenv": {
+              "version": "0.1.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "os-homedir": "^1.0.0",
+                "os-tmpdir": "^1.0.0"
+              }
+            },
+            "path-is-absolute": {
+              "version": "1.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "process-nextick-args": {
+              "version": "2.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "rc": {
+              "version": "1.2.7",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "deep-extend": "^0.5.1",
+                "ini": "~1.3.0",
+                "minimist": "^1.2.0",
+                "strip-json-comments": "~2.0.1"
+              },
+              "dependencies": {
+                "minimist": {
+                  "version": "1.2.0",
+                  "bundled": true,
+                  "dev": true,
+                  "optional": true
+                }
+              }
+            },
+            "readable-stream": {
+              "version": "2.3.6",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+              }
+            },
+            "rimraf": {
+              "version": "2.6.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "glob": "^7.0.5"
+              }
+            },
+            "safe-buffer": {
+              "version": "5.1.1",
+              "bundled": true,
+              "dev": true
+            },
+            "safer-buffer": {
+              "version": "2.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "sax": {
+              "version": "1.2.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "semver": {
+              "version": "5.5.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "set-blocking": {
+              "version": "2.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "signal-exit": {
+              "version": "3.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "string-width": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+              }
+            },
+            "string_decoder": {
+              "version": "1.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "safe-buffer": "~5.1.0"
+              }
+            },
+            "strip-ansi": {
+              "version": "3.0.1",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^2.0.0"
+              }
+            },
+            "strip-json-comments": {
+              "version": "2.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "tar": {
+              "version": "4.4.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "chownr": "^1.0.1",
+                "fs-minipass": "^1.2.5",
+                "minipass": "^2.2.4",
+                "minizlib": "^1.1.0",
+                "mkdirp": "^0.5.0",
+                "safe-buffer": "^5.1.1",
+                "yallist": "^3.0.2"
+              }
+            },
+            "util-deprecate": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "wide-align": {
+              "version": "1.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "string-width": "^1.0.2"
+              }
+            },
+            "wrappy": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true
+            },
+            "yallist": {
+              "version": "3.0.2",
+              "bundled": true,
+              "dev": true
+            }
+          }
+        },
+        "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.0"
+          },
+          "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.0"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.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.5"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.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.5"
+              }
+            }
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "dev": true
+        },
+        "upath": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
+          "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
+          "dev": true
+        }
+      }
+    },
+    "@angular-devkit/schematics": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.1.4.tgz",
+      "integrity": "sha512-+rn3ppcC3grsi9vV2uUIYh/5mUBEJ+JRCKW11BJoUqLMeu8W7h+vbVonyfwJXsk3FSTf9ZY0C7F7UqggRS3cWw==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "7.1.4",
+        "rxjs": "6.3.3"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        }
+      }
+    },
+    "@angular-redux/store": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@angular-redux/store/-/store-9.0.0.tgz",
+      "integrity": "sha512-0aWUktzTK88xDoDlGUDmDBnGW1ZB21W3H9dq0E52fuaN87cwtdca83ioi20/YT+M6EOecYPY7il9fSpy/Ewd1A=="
+    },
+    "@angular/animations": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.1.4.tgz",
+      "integrity": "sha512-877LZ83scksJtflVz97CUWlSsZnxduBxPD+ls5OTrTT/bq3muzHCm8rgTO7S8fBwwrEVXLorvMAlhDPpMg5Swg==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/cdk": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-7.2.2.tgz",
+      "integrity": "sha512-DG4Ip9COZuQngG31gNFrJRtVPYC8H938dCHuqVjHrLEKfdsKzvprI/y0W+tr/sUnIbIJWEPSvnzmS3XYOgmFyg==",
+      "requires": {
+        "parse5": "^5.0.0",
+        "tslib": "^1.7.1"
+      }
+    },
+    "@angular/cli": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.1.4.tgz",
+      "integrity": "sha512-SruaZsmyq3+ymMPeMJSzhytvgtvzyzb1q58pUYX+vZjff2aMYOo0TVxJALwTOPIABICTqUTZmujbLG9uxVgxFA==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/architect": "0.11.4",
+        "@angular-devkit/core": "7.1.4",
+        "@angular-devkit/schematics": "7.1.4",
+        "@schematics/angular": "7.1.4",
+        "@schematics/update": "0.11.4",
+        "inquirer": "6.2.0",
+        "opn": "5.3.0",
+        "semver": "5.5.1",
+        "symbol-observable": "1.2.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.5.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
+          "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
+          "dev": true
+        }
+      }
+    },
+    "@angular/common": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.1.4.tgz",
+      "integrity": "sha512-oQPCilcf1H/OXmt4z6PfGoCSb1YPRBAXGs/KRBARm3tYan2r5CmV0BFwpWXWQrEMt8YQqqLiBQUQ64d8+VFm8Q==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/compiler": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.1.4.tgz",
+      "integrity": "sha512-AvYXtjEJ27Rhv4c27DXNEa58Lit63jdydzbz7VuyFhNU+FwDUK2DC4gZe0nWZsf7HUniJezVRFkECDCZQeSKCQ==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/compiler-cli": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.1.4.tgz",
+      "integrity": "sha512-fyEY58A53pmVEuhfyU1z1TAi1n5rOK5cCjhFnUUnnESQFEW/aQYOl0ZL6LDsMSYfa78fkDw4Nc0DytvZ1ymVMw==",
+      "dev": true,
+      "requires": {
+        "canonical-path": "1.0.0",
+        "chokidar": "^1.4.2",
+        "convert-source-map": "^1.5.1",
+        "dependency-graph": "^0.7.2",
+        "magic-string": "^0.25.0",
+        "minimist": "^1.2.0",
+        "reflect-metadata": "^0.1.2",
+        "shelljs": "^0.8.1",
+        "source-map": "^0.6.1",
+        "tslib": "^1.9.0",
+        "yargs": "9.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "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
+        },
+        "load-json-file": {
+          "version": "2.0.0",
+          "resolved": "http://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.2",
+            "parse-json": "^2.2.0",
+            "pify": "^2.0.0",
+            "strip-bom": "^3.0.0"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "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.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "http://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.3.2",
+            "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.0.0",
+            "read-pkg": "^2.0.0"
+          }
+        },
+        "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-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"
+          }
+        },
+        "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
+        },
+        "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": "9.0.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz",
+          "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0",
+            "cliui": "^3.2.0",
+            "decamelize": "^1.1.1",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^2.0.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.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^3.2.1",
+            "yargs-parser": "^7.0.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "@angular/core": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.1.4.tgz",
+      "integrity": "sha512-36uWLrmmlzf8JKaq2A5F2tPQEHvFSsbTQWOT559Drp1tzM2uSA7PysNHv5TXUshDn5i54S2EQFm4bj2YPp4Hzg==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/forms": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.1.4.tgz",
+      "integrity": "sha512-YB2lDRe7aMsaO5ZlbeFZGH+uTQOcpotFDKCmTckpefRJ7id6TlUSBYdYRH80qOQfPJGpsnqQvLZkL24UMasKtQ==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/http": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.1.4.tgz",
+      "integrity": "sha512-Lrjb99sHu0Cv7MBbVLev1I1Fe+DJcwG4v7juZB/5nE5opKmbQo3Lfqvt2dVrMOxHeju9ReFznEnuGNMK6+m6pQ==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/language-service": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-7.1.4.tgz",
+      "integrity": "sha512-Pvrk3W3+6XfrmpCRcTumfyplv6AQJXKfDdPFSbhdpHJlpdcQRo6TckA85Yln5/CXZSAiPaZeiejQt2OogrIRLg==",
+      "dev": true
+    },
+    "@angular/material": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/material/-/material-7.2.2.tgz",
+      "integrity": "sha512-HTtDhK5XkDvP6GPg4WTTa0HbeeagTfVRooTfw0TA+IuTAMBhXt5h1yzuGpFyMap8/PUVZN1D04g2CLhBSzoDxg==",
+      "requires": {
+        "tslib": "^1.7.1"
+      }
+    },
+    "@angular/platform-browser": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.1.4.tgz",
+      "integrity": "sha512-lIFBKo6Uqty7qYDI9T8quFCUzUpGBgpzvDe14aAHFwZCft9rMS1J7PB1F26/dy2RBQE8tUyN2zp2xZQnYAhMcA==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/platform-browser-dynamic": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.1.4.tgz",
+      "integrity": "sha512-LtFd6XIz98BKjxrCRbaz2y0XSmVQSTzrvpAyNzKnzHAMn+4XpIpnzyV3Y6DeHolIBwLjFHFzGKMBwOHOwME4RQ==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@angular/platform-server": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-7.1.4.tgz",
+      "integrity": "sha512-4SwCzrXK4W9rlxnf+XBcqENLhKd0JVQ6S7agE56Jb3h7Vk5m9xABb+jmFYNfSqW9ZOwgM2inP7bKD9fjlp3x4g==",
+      "requires": {
+        "domino": "^2.1.0",
+        "tslib": "^1.9.0",
+        "xhr2": "^0.1.4"
+      }
+    },
+    "@angular/router": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.1.4.tgz",
+      "integrity": "sha512-5VVVcRsmuKrIWPnh5zF1ExXmIpCx2tlisJ7YTS2FFDXnqrZ9i2QgaxyJuyZE+Btg3t7LPF4tkhRQpjauNiHJYA==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "@babel/code-frame": {
+      "version": "7.0.0-beta.51",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz",
+      "integrity": "sha1-vXHZsZKvl435FYKdOdQJRFZDmgw=",
+      "requires": {
+        "@babel/highlight": "7.0.0-beta.51"
+      }
+    },
+    "@babel/core": {
+      "version": "7.3.3",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.3.3.tgz",
+      "integrity": "sha512-w445QGI2qd0E0GlSnq6huRZWPMmQGCp5gd5ZWS4hagn0EiwzxD5QMFkpchyusAyVC1n27OKXzQ0/88aVU9n4xQ==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/generator": "^7.3.3",
+        "@babel/helpers": "^7.2.0",
+        "@babel/parser": "^7.3.3",
+        "@babel/template": "^7.2.2",
+        "@babel/traverse": "^7.2.2",
+        "@babel/types": "^7.3.3",
+        "convert-source-map": "^1.1.0",
+        "debug": "^4.1.0",
+        "json5": "^2.1.0",
+        "lodash": "^4.17.11",
+        "resolve": "^1.3.2",
+        "semver": "^5.4.1",
+        "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.3.tgz",
+          "integrity": "sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.3.3",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.11",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.3.tgz",
+          "integrity": "sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+          "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.2.2",
+            "@babel/helper-function-name": "^7.1.0",
+            "@babel/helper-split-export-declaration": "^7.0.0",
+            "@babel/parser": "^7.2.3",
+            "@babel/types": "^7.2.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.10"
+          }
+        },
+        "@babel/types": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.3.tgz",
+          "integrity": "sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.11",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "globals": {
+          "version": "11.11.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz",
+          "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==",
+          "dev": true
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "dev": true
+        },
+        "json5": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
+          "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "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==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/generator": {
+      "version": "7.0.0-beta.51",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.51.tgz",
+      "integrity": "sha1-bHV1/952HQdIXgS67cA5LG2eMPY=",
+      "requires": {
+        "@babel/types": "7.0.0-beta.51",
+        "jsesc": "^2.5.1",
+        "lodash": "^4.17.5",
+        "source-map": "^0.5.0",
+        "trim-right": "^1.0.1"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "2.5.1",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
+          "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4="
+        }
+      }
+    },
+    "@babel/helper-annotate-as-pure": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
+      "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
+      "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-explode-assignable-expression": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-call-delegate": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz",
+      "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.0.0",
+        "@babel/traverse": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz",
+          "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.2.2",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.10",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz",
+          "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+          "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.2.2",
+            "@babel/helper-function-name": "^7.1.0",
+            "@babel/helper-split-export-declaration": "^7.0.0",
+            "@babel/parser": "^7.2.3",
+            "@babel/types": "^7.2.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.10"
+          }
+        },
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "globals": {
+          "version": "11.9.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+          "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+          "dev": true
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "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==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-define-map": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz",
+      "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/types": "^7.0.0",
+        "lodash": "^4.17.10"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz",
+          "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-explode-assignable-expression": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
+      "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
+      "dev": true,
+      "requires": {
+        "@babel/traverse": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz",
+          "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.2.2",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.10",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz",
+          "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+          "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.2.2",
+            "@babel/helper-function-name": "^7.1.0",
+            "@babel/helper-split-export-declaration": "^7.0.0",
+            "@babel/parser": "^7.2.3",
+            "@babel/types": "^7.2.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.10"
+          }
+        },
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "globals": {
+          "version": "11.9.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+          "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+          "dev": true
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "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==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-function-name": {
+      "version": "7.0.0-beta.51",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.51.tgz",
+      "integrity": "sha1-IbSHSiJ8+Z7K/MMKkDAtpaJkBWE=",
+      "requires": {
+        "@babel/helper-get-function-arity": "7.0.0-beta.51",
+        "@babel/template": "7.0.0-beta.51",
+        "@babel/types": "7.0.0-beta.51"
+      }
+    },
+    "@babel/helper-get-function-arity": {
+      "version": "7.0.0-beta.51",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.51.tgz",
+      "integrity": "sha1-MoGy0EWvlcFyzpGyCCXYXqRnZBE=",
+      "requires": {
+        "@babel/types": "7.0.0-beta.51"
+      }
+    },
+    "@babel/helper-hoist-variables": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz",
+      "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz",
+      "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
+      "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz",
+      "integrity": "sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/helper-simple-access": "^7.1.0",
+        "@babel/helper-split-export-declaration": "^7.0.0",
+        "@babel/template": "^7.2.2",
+        "@babel/types": "^7.2.2",
+        "lodash": "^4.17.10"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz",
+          "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
+      "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
+      "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==",
+      "dev": true
+    },
+    "@babel/helper-regex": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz",
+      "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.10"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-remap-async-to-generator": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
+      "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.0.0",
+        "@babel/helper-wrap-function": "^7.1.0",
+        "@babel/template": "^7.1.0",
+        "@babel/traverse": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz",
+          "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.2.2",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.10",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz",
+          "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+          "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.2.2",
+            "@babel/helper-function-name": "^7.1.0",
+            "@babel/helper-split-export-declaration": "^7.0.0",
+            "@babel/parser": "^7.2.3",
+            "@babel/types": "^7.2.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.10"
+          }
+        },
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "globals": {
+          "version": "11.9.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+          "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+          "dev": true
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "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==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz",
+      "integrity": "sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.0.0",
+        "@babel/helper-optimise-call-expression": "^7.0.0",
+        "@babel/traverse": "^7.2.3",
+        "@babel/types": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz",
+          "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.2.2",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.10",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz",
+          "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+          "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.2.2",
+            "@babel/helper-function-name": "^7.1.0",
+            "@babel/helper-split-export-declaration": "^7.0.0",
+            "@babel/parser": "^7.2.3",
+            "@babel/types": "^7.2.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.10"
+          }
+        },
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "globals": {
+          "version": "11.9.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+          "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+          "dev": true
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "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==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
+      "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz",
+          "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.0.0-beta.51",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.51.tgz",
+      "integrity": "sha1-imw/ZsTSZTUvwHdIT59ugKUauXg=",
+      "requires": {
+        "@babel/types": "7.0.0-beta.51"
+      }
+    },
+    "@babel/helper-wrap-function": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
+      "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/template": "^7.1.0",
+        "@babel/traverse": "^7.1.0",
+        "@babel/types": "^7.2.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz",
+          "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.2.2",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.10",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz",
+          "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+          "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.2.2",
+            "@babel/helper-function-name": "^7.1.0",
+            "@babel/helper-split-export-declaration": "^7.0.0",
+            "@babel/parser": "^7.2.3",
+            "@babel/types": "^7.2.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.10"
+          }
+        },
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "globals": {
+          "version": "11.9.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+          "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+          "dev": true
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "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==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helpers": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.3.1.tgz",
+      "integrity": "sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.1.2",
+        "@babel/traverse": "^7.1.5",
+        "@babel/types": "^7.3.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.3.tgz",
+          "integrity": "sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.3.3",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.11",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.3.tgz",
+          "integrity": "sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+          "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.2.2",
+            "@babel/helper-function-name": "^7.1.0",
+            "@babel/helper-split-export-declaration": "^7.0.0",
+            "@babel/parser": "^7.2.3",
+            "@babel/types": "^7.2.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.10"
+          }
+        },
+        "@babel/types": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.3.tgz",
+          "integrity": "sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.11",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "globals": {
+          "version": "11.11.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz",
+          "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==",
+          "dev": true
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "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==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.0.0-beta.51",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.51.tgz",
+      "integrity": "sha1-6IRK4loVlcz9QriWI7Q3bKBtIl0=",
+      "requires": {
+        "chalk": "^2.0.0",
+        "esutils": "^2.0.2",
+        "js-tokens": "^3.0.0"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.0.0-beta.51",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-beta.51.tgz",
+      "integrity": "sha1-J87C30Cd9gr1gnDtj2qlVAnqhvY="
+    },
+    "@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz",
+      "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-remap-async-to-generator": "^7.1.0",
+        "@babel/plugin-syntax-async-generators": "^7.2.0"
+      }
+    },
+    "@babel/plugin-proposal-json-strings": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
+      "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-json-strings": "^7.2.0"
+      }
+    },
+    "@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz",
+      "integrity": "sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
+      }
+    },
+    "@babel/plugin-proposal-optional-catch-binding": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz",
+      "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.2.0"
+      }
+    },
+    "@babel/plugin-proposal-unicode-property-regex": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz",
+      "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.0.0",
+        "regexpu-core": "^4.2.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        },
+        "regenerate": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+          "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+          "dev": true
+        },
+        "regexpu-core": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz",
+          "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==",
+          "dev": true,
+          "requires": {
+            "regenerate": "^1.4.0",
+            "regenerate-unicode-properties": "^7.0.0",
+            "regjsgen": "^0.5.0",
+            "regjsparser": "^0.6.0",
+            "unicode-match-property-ecmascript": "^1.0.4",
+            "unicode-match-property-value-ecmascript": "^1.0.2"
+          }
+        },
+        "regjsgen": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
+          "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
+          "dev": true
+        },
+        "regjsparser": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
+          "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
+          "dev": true,
+          "requires": {
+            "jsesc": "~0.5.0"
+          }
+        }
+      }
+    },
+    "@babel/plugin-syntax-async-generators": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz",
+      "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-json-strings": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
+      "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz",
+      "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz",
+      "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-arrow-functions": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz",
+      "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-async-to-generator": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz",
+      "integrity": "sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-remap-async-to-generator": "^7.1.0"
+      }
+    },
+    "@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz",
+      "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-block-scoping": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz",
+      "integrity": "sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "lodash": "^4.17.10"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/plugin-transform-classes": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz",
+      "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.0.0",
+        "@babel/helper-define-map": "^7.1.0",
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/helper-optimise-call-expression": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-replace-supers": "^7.1.0",
+        "@babel/helper-split-export-declaration": "^7.0.0",
+        "globals": "^11.1.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz",
+          "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "globals": {
+          "version": "11.9.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+          "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+          "dev": true
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/plugin-transform-computed-properties": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz",
+      "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-destructuring": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz",
+      "integrity": "sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-dotall-regex": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz",
+      "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.0.0",
+        "regexpu-core": "^4.1.3"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        },
+        "regenerate": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+          "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+          "dev": true
+        },
+        "regexpu-core": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz",
+          "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==",
+          "dev": true,
+          "requires": {
+            "regenerate": "^1.4.0",
+            "regenerate-unicode-properties": "^7.0.0",
+            "regjsgen": "^0.5.0",
+            "regjsparser": "^0.6.0",
+            "unicode-match-property-ecmascript": "^1.0.4",
+            "unicode-match-property-value-ecmascript": "^1.0.2"
+          }
+        },
+        "regjsgen": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
+          "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
+          "dev": true
+        },
+        "regjsparser": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
+          "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
+          "dev": true,
+          "requires": {
+            "jsesc": "~0.5.0"
+          }
+        }
+      }
+    },
+    "@babel/plugin-transform-duplicate-keys": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz",
+      "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz",
+      "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-for-of": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz",
+      "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-function-name": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz",
+      "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.1.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz",
+          "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/plugin-transform-literals": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz",
+      "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-modules-amd": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz",
+      "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.1.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-modules-commonjs": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz",
+      "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.1.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-simple-access": "^7.1.0"
+      }
+    },
+    "@babel/plugin-transform-modules-systemjs": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz",
+      "integrity": "sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-modules-umd": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz",
+      "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.1.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-new-target": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz",
+      "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-object-super": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz",
+      "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-replace-supers": "^7.1.0"
+      }
+    },
+    "@babel/plugin-transform-parameters": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz",
+      "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-call-delegate": "^7.1.0",
+        "@babel/helper-get-function-arity": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      },
+      "dependencies": {
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/types": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+          "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.10",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/plugin-transform-regenerator": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz",
+      "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "^0.13.3"
+      },
+      "dependencies": {
+        "regenerator-transform": {
+          "version": "0.13.3",
+          "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz",
+          "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==",
+          "dev": true,
+          "requires": {
+            "private": "^0.1.6"
+          }
+        }
+      }
+    },
+    "@babel/plugin-transform-shorthand-properties": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz",
+      "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-spread": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz",
+      "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-sticky-regex": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz",
+      "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-template-literals": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz",
+      "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-typeof-symbol": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz",
+      "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0"
+      }
+    },
+    "@babel/plugin-transform-unicode-regex": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz",
+      "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/helper-regex": "^7.0.0",
+        "regexpu-core": "^4.1.3"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        },
+        "regenerate": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+          "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+          "dev": true
+        },
+        "regexpu-core": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz",
+          "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==",
+          "dev": true,
+          "requires": {
+            "regenerate": "^1.4.0",
+            "regenerate-unicode-properties": "^7.0.0",
+            "regjsgen": "^0.5.0",
+            "regjsparser": "^0.6.0",
+            "unicode-match-property-ecmascript": "^1.0.4",
+            "unicode-match-property-value-ecmascript": "^1.0.2"
+          }
+        },
+        "regjsgen": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
+          "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
+          "dev": true
+        },
+        "regjsparser": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
+          "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
+          "dev": true,
+          "requires": {
+            "jsesc": "~0.5.0"
+          }
+        }
+      }
+    },
+    "@babel/preset-env": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.2.3.tgz",
+      "integrity": "sha512-AuHzW7a9rbv5WXmvGaPX7wADxFkZIqKlbBh1dmZUQp4iwiPpkE/Qnrji6SC4UQCQzvWY/cpHET29eUhXS9cLPw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
+        "@babel/plugin-proposal-json-strings": "^7.2.0",
+        "@babel/plugin-proposal-object-rest-spread": "^7.2.0",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.2.0",
+        "@babel/plugin-syntax-async-generators": "^7.2.0",
+        "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
+        "@babel/plugin-transform-arrow-functions": "^7.2.0",
+        "@babel/plugin-transform-async-to-generator": "^7.2.0",
+        "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
+        "@babel/plugin-transform-block-scoping": "^7.2.0",
+        "@babel/plugin-transform-classes": "^7.2.0",
+        "@babel/plugin-transform-computed-properties": "^7.2.0",
+        "@babel/plugin-transform-destructuring": "^7.2.0",
+        "@babel/plugin-transform-dotall-regex": "^7.2.0",
+        "@babel/plugin-transform-duplicate-keys": "^7.2.0",
+        "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
+        "@babel/plugin-transform-for-of": "^7.2.0",
+        "@babel/plugin-transform-function-name": "^7.2.0",
+        "@babel/plugin-transform-literals": "^7.2.0",
+        "@babel/plugin-transform-modules-amd": "^7.2.0",
+        "@babel/plugin-transform-modules-commonjs": "^7.2.0",
+        "@babel/plugin-transform-modules-systemjs": "^7.2.0",
+        "@babel/plugin-transform-modules-umd": "^7.2.0",
+        "@babel/plugin-transform-new-target": "^7.0.0",
+        "@babel/plugin-transform-object-super": "^7.2.0",
+        "@babel/plugin-transform-parameters": "^7.2.0",
+        "@babel/plugin-transform-regenerator": "^7.0.0",
+        "@babel/plugin-transform-shorthand-properties": "^7.2.0",
+        "@babel/plugin-transform-spread": "^7.2.0",
+        "@babel/plugin-transform-sticky-regex": "^7.2.0",
+        "@babel/plugin-transform-template-literals": "^7.2.0",
+        "@babel/plugin-transform-typeof-symbol": "^7.2.0",
+        "@babel/plugin-transform-unicode-regex": "^7.2.0",
+        "browserslist": "^4.3.4",
+        "invariant": "^2.2.2",
+        "js-levenshtein": "^1.1.3",
+        "semver": "^5.3.0"
+      },
+      "dependencies": {
+        "browserslist": {
+          "version": "4.3.6",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.6.tgz",
+          "integrity": "sha512-kMGKs4BTzRWviZ8yru18xBpx+CyHG9eqgRbj9XbE3IMgtczf4aiA0Y1YCpVdvUieKGZ03kolSPXqTcscBCb9qw==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "^1.0.30000921",
+            "electron-to-chromium": "^1.3.92",
+            "node-releases": "^1.1.1"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30000925",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000925.tgz",
+          "integrity": "sha512-zcYupoUxtW46rOikuDF7vfL9N1Qe9ZuUBTz3n3q8fFsoJIs/h9UN6Vg/0QpjsmvImXw9mVc3g+ZBfqvUz/iALA==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.96",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.96.tgz",
+          "integrity": "sha512-ZUXBUyGLeoJxp4Nt6G/GjBRLnyz8IKQGexZ2ndWaoegThgMGFO1tdDYID5gBV32/1S83osjJHyfzvanE/8HY4Q==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/template": {
+      "version": "7.0.0-beta.51",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.51.tgz",
+      "integrity": "sha1-lgKkCuvPNXrpZ34lMu9fyBD1+/8=",
+      "requires": {
+        "@babel/code-frame": "7.0.0-beta.51",
+        "@babel/parser": "7.0.0-beta.51",
+        "@babel/types": "7.0.0-beta.51",
+        "lodash": "^4.17.5"
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.0.0-beta.51",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.51.tgz",
+      "integrity": "sha1-mB2vLOw0emIx06odnhgDsDqqpKg=",
+      "requires": {
+        "@babel/code-frame": "7.0.0-beta.51",
+        "@babel/generator": "7.0.0-beta.51",
+        "@babel/helper-function-name": "7.0.0-beta.51",
+        "@babel/helper-split-export-declaration": "7.0.0-beta.51",
+        "@babel/parser": "7.0.0-beta.51",
+        "@babel/types": "7.0.0-beta.51",
+        "debug": "^3.1.0",
+        "globals": "^11.1.0",
+        "invariant": "^2.2.0",
+        "lodash": "^4.17.5"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "globals": {
+          "version": "11.7.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz",
+          "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg=="
+        }
+      }
+    },
+    "@babel/types": {
+      "version": "7.0.0-beta.51",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.51.tgz",
+      "integrity": "sha1-2AK3tUO1g2x3iqaReXq/APPZfqk=",
+      "requires": {
+        "esutils": "^2.0.2",
+        "lodash": "^4.17.5",
+        "to-fast-properties": "^2.0.0"
+      },
+      "dependencies": {
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+        }
+      }
+    },
+    "@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.1.0",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^4.0.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.0.0",
+            "interpret": "^1.0.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.27.2",
+        "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.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "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.0"
+          }
+        },
+        "onetime": {
+          "version": "1.1.0",
+          "resolved": "https://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.0.0",
+            "onetime": "^1.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
+        }
+      }
+    },
+    "@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.0.0",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.3.0"
+          }
+        },
+        "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.0.2",
+            "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.22.0",
+            "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.23.0",
+            "babel-plugin-transform-es2015-classes": "^6.23.0",
+            "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
+            "babel-plugin-transform-es2015-destructuring": "^6.23.0",
+            "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
+            "babel-plugin-transform-es2015-for-of": "^6.23.0",
+            "babel-plugin-transform-es2015-function-name": "^6.22.0",
+            "babel-plugin-transform-es2015-literals": "^6.22.0",
+            "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
+            "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
+            "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
+            "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
+            "babel-plugin-transform-es2015-object-super": "^6.22.0",
+            "babel-plugin-transform-es2015-parameters": "^6.23.0",
+            "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
+            "babel-plugin-transform-es2015-spread": "^6.22.0",
+            "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
+            "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.22.0",
+            "babel-plugin-transform-exponentiation-operator": "^6.22.0",
+            "babel-plugin-transform-regenerator": "^6.22.0",
+            "browserslist": "^2.1.2",
+            "invariant": "^2.2.2",
+            "semver": "^5.3.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.1",
+            "right-align": "^0.1.1",
+            "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.2",
+            "parse-json": "^2.2.0",
+            "pify": "^2.0.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.0.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.3.2",
+            "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.0.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.1",
+            "uglify-to-browserify": "~1.0.0",
+            "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.0.2",
+                "cliui": "^2.1.0",
+                "decamelize": "^1.0.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.6",
+            "uglify-js": "^2.8.29",
+            "webpack-sources": "^1.0.1"
+          }
+        },
+        "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.0.0",
+            "acorn-dynamic-import": "^2.0.0",
+            "ajv": "^5.1.5",
+            "ajv-keywords": "^2.0.0",
+            "async": "^2.1.2",
+            "enhanced-resolve": "^3.4.0",
+            "escope": "^3.6.0",
+            "interpret": "^1.0.0",
+            "json-loader": "^0.5.4",
+            "json5": "^0.5.1",
+            "loader-runner": "^2.3.0",
+            "loader-utils": "^1.1.0",
+            "memory-fs": "~0.4.1",
+            "mkdirp": "~0.5.0",
+            "node-libs-browser": "^2.0.0",
+            "source-map": "^0.5.3",
+            "supports-color": "^4.2.1",
+            "tapable": "^0.2.7",
+            "uglifyjs-webpack-plugin": "^0.4.6",
+            "watchpack": "^1.4.0",
+            "webpack-sources": "^1.0.1",
+            "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.1.1",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^2.0.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.0.0",
+            "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.1",
+                "strip-ansi": "^3.0.1",
+                "wrap-ansi": "^2.0.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.0.0",
+                    "is-fullwidth-code-point": "^1.0.0",
+                    "strip-ansi": "^3.0.0"
+                  }
+                }
+              }
+            }
+          }
+        },
+        "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.2.3",
+      "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.3.tgz",
+      "integrity": "sha512-yYrK+/bgL3hwoRHMZG4r5fyLniCy1pXex5fimtewAY6vE/jsVs8Q37UsEO03tFlcmiLnQ3rBNMaZBYTi/+C1cw==",
+      "dev": true,
+      "requires": {
+        "debug": "^3.1.0",
+        "lodash.once": "^4.1.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "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==",
+          "dev": true
+        }
+      }
+    },
+    "@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.7.1"
+      }
+    },
+    "@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/webpack": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.1.4.tgz",
+      "integrity": "sha512-8A15TPJzg3g7yI70QvBzJ253P32WAgCVre9nMaDdd22UmlbvN8Ke4RuQY7vYVTECLL+bWpFJEFXL+ThzCRUgeA==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "7.1.4",
+        "enhanced-resolve": "4.1.0",
+        "rxjs": "6.3.3",
+        "tree-kill": "1.2.0",
+        "webpack-sources": "1.2.0"
+      },
+      "dependencies": {
+        "enhanced-resolve": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
+          "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "memory-fs": "^0.4.0",
+            "tapable": "^1.0.0"
+          }
+        },
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
+        "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
+        },
+        "tapable": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz",
+          "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==",
+          "dev": true
+        },
+        "webpack-sources": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz",
+          "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==",
+          "dev": true,
+          "requires": {
+            "source-list-map": "^2.0.0",
+            "source-map": "~0.6.1"
+          }
+        }
+      }
+    },
+    "@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": "7.1.4",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.1.4.tgz",
+      "integrity": "sha512-4QVSmvQtOELek+FDq+k2ROeH9YrRrPJ6jWK179+qOruKSd4uTgEti/jy+fS0rfr52kDSGdDhz7XTh/QvQB89fg==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "7.1.4",
+        "@angular-devkit/schematics": "7.1.4",
+        "typescript": "3.1.6"
+      },
+      "dependencies": {
+        "typescript": {
+          "version": "3.1.6",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz",
+          "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==",
+          "dev": true
+        }
+      }
+    },
+    "@schematics/update": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.11.4.tgz",
+      "integrity": "sha512-InfsMJtdWwoqCPmtlJeXBwRPPgIXUzpzIkCCcayRe9gy6PkPUIlOjfgEZ4Mqm/HR46lqsI8xwZfUK7SLV//a2g==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "7.1.4",
+        "@angular-devkit/schematics": "7.1.4",
+        "@yarnpkg/lockfile": "1.1.0",
+        "ini": "1.3.5",
+        "pacote": "9.1.1",
+        "rxjs": "6.3.3",
+        "semver": "5.5.1",
+        "semver-intersect": "1.4.0"
+      },
+      "dependencies": {
+        "rxjs": {
+          "version": "6.3.3",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+          "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
+        "semver": {
+          "version": "5.5.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
+          "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
+          "dev": true
+        }
+      }
+    },
+    "@turf/along": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/along/-/along-5.1.5.tgz",
+      "integrity": "sha1-YdbmplhKzdq1asVYTge/jL5fi+s=",
+      "requires": {
+        "@turf/bearing": "^5.1.5",
+        "@turf/destination": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/area": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/area/-/area-5.1.5.tgz",
+      "integrity": "sha1-79iZv9Jgzb0VQbKjwVX4pdLu+h0=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/bbox": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-5.1.5.tgz",
+      "integrity": "sha1-MFHfUUrUxQ9KT5uKLRX9i2hA7aM=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/bbox-clip": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-5.1.5.tgz",
+      "integrity": "sha1-M2S1Mo3/nzz0HZ4C7a/zdNFQzIQ=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "lineclip": "^1.1.5"
+      }
+    },
+    "@turf/bbox-polygon": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-5.1.5.tgz",
+      "integrity": "sha1-auuk7VHYXSluD3w4uIwznwHu4CQ=",
+      "requires": {
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/bearing": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-5.1.5.tgz",
+      "integrity": "sha1-egt5ATbE70eX8CRjBdRcvi0ns/c=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/bezier-spline": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/bezier-spline/-/bezier-spline-5.1.5.tgz",
+      "integrity": "sha1-WaJ7ul17l+8Vqz/VpA+9I4cEm8o=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/boolean-clockwise": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-5.1.5.tgz",
+      "integrity": "sha1-MwK32sYsXikaB4nimvcoM4f6nes=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/boolean-contains": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/boolean-contains/-/boolean-contains-5.1.5.tgz",
+      "integrity": "sha1-WW1jruY2961T7pn5/yTJaZSg7xQ=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/boolean-point-on-line": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/boolean-crosses": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/boolean-crosses/-/boolean-crosses-5.1.5.tgz",
+      "integrity": "sha1-Ab+uollvFk3kpNMlCU3HwlXHFdY=",
+      "requires": {
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/line-intersect": "^5.1.5",
+        "@turf/polygon-to-line": "^5.1.5"
+      }
+    },
+    "@turf/boolean-disjoint": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-5.1.6.tgz",
+      "integrity": "sha512-KHvUS6SBNYHBCLIJEJrg04pF5Oy+Fqn8V5G9U+9pti5vI9tyX7Ln2g7RSB7iJ1Cxsz8QAi6OukhXjEF2/8ZpGg==",
+      "requires": {
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/line-intersect": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/polygon-to-line": "^5.1.5"
+      }
+    },
+    "@turf/boolean-equal": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/boolean-equal/-/boolean-equal-5.1.5.tgz",
+      "integrity": "sha1-Kfj21gu4RQff12WzIlTbjnLJOKQ=",
+      "requires": {
+        "@turf/clean-coords": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "geojson-equality": "0.1.6"
+      }
+    },
+    "@turf/boolean-overlap": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-5.1.5.tgz",
+      "integrity": "sha1-DU5kxSx3CijpPZ7834qLg3OsznU=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/line-intersect": "^5.1.5",
+        "@turf/line-overlap": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "geojson-equality": "0.1.6"
+      }
+    },
+    "@turf/boolean-parallel": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/boolean-parallel/-/boolean-parallel-5.1.5.tgz",
+      "integrity": "sha1-c5NYR16ltlx+GCejw+DopofTqF0=",
+      "requires": {
+        "@turf/clean-coords": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/line-segment": "^5.1.5",
+        "@turf/rhumb-bearing": "^5.1.5"
+      }
+    },
+    "@turf/boolean-point-in-polygon": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-5.1.5.tgz",
+      "integrity": "sha1-8BzBlNHgMKVIv9qYHLpDz9YpQbc=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/boolean-point-on-line": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-5.1.5.tgz",
+      "integrity": "sha1-9jPF/4Aq0ku48Vja269v9KAj3Xs=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/boolean-within": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-5.1.5.tgz",
+      "integrity": "sha1-RxBdVtB1Kp0Pv81Dw2pfkUnchpc=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/boolean-point-on-line": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/buffer": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/buffer/-/buffer-5.1.5.tgz",
+      "integrity": "sha1-hByWJ8+5dLEirE4alW8EZrwCMcQ=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/center": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/projection": "^5.1.5",
+        "d3-geo": "1.7.1",
+        "turf-jsts": "*"
+      }
+    },
+    "@turf/center": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/center/-/center-5.1.5.tgz",
+      "integrity": "sha1-RKss2VT2PA03dX9xWKmcPvURS4A=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/center-mean": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/center-mean/-/center-mean-5.1.5.tgz",
+      "integrity": "sha1-jI6YdTkeXwnw5uePXWYbiLIQigo=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/center-median": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/center-median/-/center-median-5.1.5.tgz",
+      "integrity": "sha1-u0Yb/noqSGAdikcnaFcYcjoUqHI=",
+      "requires": {
+        "@turf/center-mean": "^5.1.5",
+        "@turf/centroid": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/center-of-mass": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/center-of-mass/-/center-of-mass-5.1.5.tgz",
+      "integrity": "sha1-TTvXnYhJjbq4Mk1PafAyL2Uguco=",
+      "requires": {
+        "@turf/centroid": "^5.1.5",
+        "@turf/convex": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/centroid": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-5.1.5.tgz",
+      "integrity": "sha1-d4radCFjNQIa2P0OemWoNJ1Tx2k=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/circle": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/circle/-/circle-5.1.5.tgz",
+      "integrity": "sha1-mxV3g1UIq1L7HBCypQZcuiuHtqU=",
+      "requires": {
+        "@turf/destination": "^5.1.5",
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/clean-coords": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-5.1.5.tgz",
+      "integrity": "sha1-EoAKmKeMmkUqcuxChJPEOs8q2h8=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/clone": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-5.1.5.tgz",
+      "integrity": "sha1-JT6NNUdxgZduM636tQoPAqfw42c=",
+      "requires": {
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/clusters": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/clusters/-/clusters-5.1.5.tgz",
+      "integrity": "sha1-ZzpeXxsZycq6vFfJCO6t1oIiTdQ=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/clusters-dbscan": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/clusters-dbscan/-/clusters-dbscan-5.1.5.tgz",
+      "integrity": "sha1-V4H7TmVsdHoLjpk333MYHAMJ4m8=",
+      "requires": {
+        "@turf/clone": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "density-clustering": "1.3.0"
+      }
+    },
+    "@turf/clusters-kmeans": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/clusters-kmeans/-/clusters-kmeans-5.1.5.tgz",
+      "integrity": "sha1-/W3+qLEzuovcI3CsPKzuFYejAvE=",
+      "requires": {
+        "@turf/clone": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "skmeans": "0.9.7"
+      }
+    },
+    "@turf/collect": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/collect/-/collect-5.1.5.tgz",
+      "integrity": "sha1-/pjJqMIY7PJP/DPXApUXt8GbKj4=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "rbush": "^2.0.1"
+      }
+    },
+    "@turf/combine": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/combine/-/combine-5.1.5.tgz",
+      "integrity": "sha1-uxS976VVBDVxlfwaEkzX1TqMiQU=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/concave": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/concave/-/concave-5.1.5.tgz",
+      "integrity": "sha1-I7uqw4fQNLlldKG9cNBZI3qdIRA=",
+      "requires": {
+        "@turf/clone": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/tin": "^5.1.5",
+        "topojson-client": "3.x",
+        "topojson-server": "3.x"
+      }
+    },
+    "@turf/convex": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/convex/-/convex-5.1.5.tgz",
+      "integrity": "sha1-Dfk3fdACIWzpghsH9wXgN9rj4B0=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "concaveman": "*"
+      }
+    },
+    "@turf/destination": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-5.1.5.tgz",
+      "integrity": "sha1-7TU4G9zoO73cvQei4rzivd/7zCY=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/difference": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/difference/-/difference-5.1.5.tgz",
+      "integrity": "sha1-ok1pCnvKgD8QkKnuO52Qb8Q3H0I=",
+      "requires": {
+        "@turf/area": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "turf-jsts": "*"
+      }
+    },
+    "@turf/dissolve": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/dissolve/-/dissolve-5.1.5.tgz",
+      "integrity": "sha1-LPEzqQIdIWODHD16lY1lB/nYGTg=",
+      "requires": {
+        "@turf/boolean-overlap": "^5.1.5",
+        "@turf/clone": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/line-intersect": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/union": "^5.1.5",
+        "geojson-rbush": "2.1.0",
+        "get-closest": "*"
+      }
+    },
+    "@turf/distance": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-5.1.5.tgz",
+      "integrity": "sha1-Oc8YIEu/h1h9cH5gmmARiQkVZAk=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/ellipse": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/ellipse/-/ellipse-5.1.5.tgz",
+      "integrity": "sha1-1XyrhTmFkgzeYCKKeNgEWAJcVL4=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/rhumb-destination": "^5.1.5",
+        "@turf/transform-rotate": "^5.1.5"
+      }
+    },
+    "@turf/envelope": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/envelope/-/envelope-5.1.5.tgz",
+      "integrity": "sha1-UBMwnFP91D369LWIplw/7X28EIo=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/bbox-polygon": "^5.1.5",
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/explode": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/explode/-/explode-5.1.5.tgz",
+      "integrity": "sha1-sSsvd0AEobSPYrqVsgocZVo94Rg=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/flatten": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/flatten/-/flatten-5.1.5.tgz",
+      "integrity": "sha1-2iknBnEz7WFpsLnWB7khVoiqE1g=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/flip": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/flip/-/flip-5.1.5.tgz",
+      "integrity": "sha1-Q29kOnIvDKU7n85jjkaT2zYIpoo=",
+      "requires": {
+        "@turf/clone": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/great-circle": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/great-circle/-/great-circle-5.1.5.tgz",
+      "integrity": "sha1-3r+2cc5HVQnLY3MBwV/PzPo1mpM=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/helpers": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz",
+      "integrity": "sha1-FTQFInq5M9AEpbuWQantmZ/L4M8="
+    },
+    "@turf/hex-grid": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/hex-grid/-/hex-grid-5.1.5.tgz",
+      "integrity": "sha1-m3ul/s9QUfHoWJL3E/zlxVBQKmo=",
+      "requires": {
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/intersect": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/interpolate": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/interpolate/-/interpolate-5.1.5.tgz",
+      "integrity": "sha1-DxLwq3VtbdEK+ykMpuh3ve8BPqo=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/centroid": "^5.1.5",
+        "@turf/clone": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/hex-grid": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/point-grid": "^5.1.5",
+        "@turf/square-grid": "^5.1.5",
+        "@turf/triangle-grid": "^5.1.5"
+      }
+    },
+    "@turf/intersect": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-5.1.6.tgz",
+      "integrity": "sha512-KXyNv/GXdoGAOy03qZF53rgtXC2tNhF/4jLwTKiVRrBQH6kcEpipGStdJ+QkYIlarQPa8f7I9UlVAB19et4MfQ==",
+      "requires": {
+        "@turf/clean-coords": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/truncate": "^5.1.5",
+        "turf-jsts": "*"
+      }
+    },
+    "@turf/invariant": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.1.5.tgz",
+      "integrity": "sha1-9Z9P76CSJLFdzhZR+QPIaNV6JOE=",
+      "requires": {
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/isobands": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/isobands/-/isobands-5.1.5.tgz",
+      "integrity": "sha1-a0TO9YTVUaMTBBh68jtKFYLj8I0=",
+      "requires": {
+        "@turf/area": "^5.1.5",
+        "@turf/bbox": "^5.1.5",
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/explode": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/isolines": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/isolines/-/isolines-5.1.5.tgz",
+      "integrity": "sha1-irTn9Cuz38VGFOW/FVln9+VdLeE=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/kinks": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-5.1.5.tgz",
+      "integrity": "sha1-irtpYdm7AQchO63fLCwmQNAlaYA=",
+      "requires": {
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/length": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/length/-/length-5.1.5.tgz",
+      "integrity": "sha1-86X4ZMK5lqi7RxeUU1ofrxLuvvs=",
+      "requires": {
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/line-arc": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/line-arc/-/line-arc-5.1.5.tgz",
+      "integrity": "sha1-AHinRHg1oSrkFKIR+aZNEYYVDhU=",
+      "requires": {
+        "@turf/circle": "^5.1.5",
+        "@turf/destination": "^5.1.5",
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/line-chunk": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/line-chunk/-/line-chunk-5.1.5.tgz",
+      "integrity": "sha1-kQqFwFwG2dD5w4l3oF4IGNUIXEI=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/length": "^5.1.5",
+        "@turf/line-slice-along": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/line-intersect": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-5.1.5.tgz",
+      "integrity": "sha1-DikHGuQDKV5JFyO8SfXPrI0R3fM=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/line-segment": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "geojson-rbush": "2.1.0"
+      }
+    },
+    "@turf/line-offset": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/line-offset/-/line-offset-5.1.5.tgz",
+      "integrity": "sha1-KrWy8In4yRPiMdmUN4553KkLWh4=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/line-overlap": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-5.1.5.tgz",
+      "integrity": "sha1-lDxvh6A4bcQ9+sEdKz/5wRLNP2A=",
+      "requires": {
+        "@turf/boolean-point-on-line": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/line-segment": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/nearest-point-on-line": "^5.1.5",
+        "geojson-rbush": "2.1.0"
+      }
+    },
+    "@turf/line-segment": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-5.1.5.tgz",
+      "integrity": "sha1-Mgeq7lRqskw9jcPMY/kcdwuAE+U=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/line-slice": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/line-slice/-/line-slice-5.1.5.tgz",
+      "integrity": "sha1-Hs/OFGKjeFeXVM7fRGTN4mgp8rU=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/nearest-point-on-line": "^5.1.5"
+      }
+    },
+    "@turf/line-slice-along": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/line-slice-along/-/line-slice-along-5.1.5.tgz",
+      "integrity": "sha1-7drQoh70efKWihG9LdcomiEy6aU=",
+      "requires": {
+        "@turf/bearing": "^5.1.5",
+        "@turf/destination": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/line-split": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/line-split/-/line-split-5.1.5.tgz",
+      "integrity": "sha1-Wy30w3YZty73JbUWPPmSbVVArLc=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/line-intersect": "^5.1.5",
+        "@turf/line-segment": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/nearest-point-on-line": "^5.1.5",
+        "@turf/square": "^5.1.5",
+        "@turf/truncate": "^5.1.5",
+        "geojson-rbush": "2.1.0"
+      }
+    },
+    "@turf/line-to-polygon": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/line-to-polygon/-/line-to-polygon-5.1.5.tgz",
+      "integrity": "sha1-ITz0Gmj4Ikd4ujnTGH3sPouBhlo=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/mask": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/mask/-/mask-5.1.5.tgz",
+      "integrity": "sha1-mrD+8aJyyY/j70kvn/thggayQtU=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/union": "^5.1.5",
+        "rbush": "^2.0.1"
+      }
+    },
+    "@turf/meta": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-5.1.6.tgz",
+      "integrity": "sha1-wgqGPt7Qhp+yhUje6Ik0G8y0akY=",
+      "requires": {
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/midpoint": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/midpoint/-/midpoint-5.1.5.tgz",
+      "integrity": "sha1-4mH2srDqgSTM7/VSomLdRlydBfA=",
+      "requires": {
+        "@turf/bearing": "^5.1.5",
+        "@turf/destination": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/nearest-point": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/nearest-point/-/nearest-point-5.1.5.tgz",
+      "integrity": "sha1-EgUN5Bw5hEMiTHl43g9iE5ANNPs=",
+      "requires": {
+        "@turf/clone": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/nearest-point-on-line": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-5.1.5.tgz",
+      "integrity": "sha1-VgauKX8VlHUkvqUaKp71HsG/nDY=",
+      "requires": {
+        "@turf/bearing": "^5.1.5",
+        "@turf/destination": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/line-intersect": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/nearest-point-to-line": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/@turf/nearest-point-to-line/-/nearest-point-to-line-5.1.6.tgz",
+      "integrity": "sha512-ZSvDIEiHhifn/vNwLXZI/E8xmEz5yBPqfUR7BVHRZrB1cP7jLhKZvkbidjG//uW8Fr1Ulc+PFOXczLspIcx/lw==",
+      "requires": {
+        "@turf/helpers": "6.x",
+        "@turf/invariant": "6.x",
+        "@turf/meta": "6.x",
+        "@turf/point-to-line-distance": "^5.1.5",
+        "object-assign": "*"
+      },
+      "dependencies": {
+        "@turf/helpers": {
+          "version": "6.1.4",
+          "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.1.4.tgz",
+          "integrity": "sha512-vJvrdOZy1ngC7r3MDA7zIGSoIgyrkWcGnNIEaqn/APmw+bVLF2gAW7HIsdTxd12s5wQMqEpqIQrmrbRRZ0xC7g=="
+        },
+        "@turf/invariant": {
+          "version": "6.1.2",
+          "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.1.2.tgz",
+          "integrity": "sha512-WU08Ph8j0J2jVGlQCKChXoCtI50BB3yEH21V++V0T4cR1T27HKCxkehV2sYMwTierfMBgjwSwDIsxnR4/2mWXg==",
+          "requires": {
+            "@turf/helpers": "6.x"
+          }
+        },
+        "@turf/meta": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.0.2.tgz",
+          "integrity": "sha512-VA7HJkx7qF1l3+GNGkDVn2oXy4+QoLP6LktXAaZKjuT1JI0YESat7quUkbCMy4zP9lAUuvS4YMslLyTtr919FA==",
+          "requires": {
+            "@turf/helpers": "6.x"
+          }
+        }
+      }
+    },
+    "@turf/planepoint": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/planepoint/-/planepoint-5.1.5.tgz",
+      "integrity": "sha1-GLvfAG91ne9eQsagBsn53oGyt/8=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/point-grid": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/point-grid/-/point-grid-5.1.5.tgz",
+      "integrity": "sha1-MFFBJI9Quv42zn5mukuX56sjaIc=",
+      "requires": {
+        "@turf/boolean-within": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/point-on-feature": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/point-on-feature/-/point-on-feature-5.1.5.tgz",
+      "integrity": "sha1-MMfwMkMCd8ZBjZbSieRba/shP+c=",
+      "requires": {
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/center": "^5.1.5",
+        "@turf/explode": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/nearest-point": "^5.1.5"
+      }
+    },
+    "@turf/point-to-line-distance": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/@turf/point-to-line-distance/-/point-to-line-distance-5.1.6.tgz",
+      "integrity": "sha512-PE3hiTeeDEi4ZLPtI8XAzFYW9nHo1EVsZGm/4ZVV8jo39d3X1oLVHxY3e1PkCmWwRapXy4QLqvnTQ7nU4wspNw==",
+      "requires": {
+        "@turf/bearing": "6.x",
+        "@turf/distance": "6.x",
+        "@turf/helpers": "6.x",
+        "@turf/invariant": "6.x",
+        "@turf/meta": "6.x",
+        "@turf/projection": "6.x",
+        "@turf/rhumb-bearing": "6.x",
+        "@turf/rhumb-distance": "6.x"
+      },
+      "dependencies": {
+        "@turf/bearing": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-6.0.1.tgz",
+          "integrity": "sha512-mXY1NozqV9EFfBTbUItujwfqfQF0G/Xe2fzvnZle90ekPEUfhi4Dgf5JswJTd96J9LiT8kcd6Jonp5khnx0wIg==",
+          "requires": {
+            "@turf/helpers": "6.x",
+            "@turf/invariant": "6.x"
+          }
+        },
+        "@turf/clone": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-6.0.2.tgz",
+          "integrity": "sha512-UVpYPnW3wRj3bPncR6Z2PRbowBk+nEdVWgGewPxrKKLfvswtVtG9n/OIyvbU3E3ZOadBVxTH2uAMEMOz4800FA==",
+          "requires": {
+            "@turf/helpers": "6.x"
+          }
+        },
+        "@turf/distance": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.0.1.tgz",
+          "integrity": "sha512-q7t7rWIWfkg7MP1Vt4uLjSEhe5rPfCO2JjpKmk7JC+QZKEQkuvHEqy3ejW1iC7Kw5ZcZNR3qdMGGz+6HnVwqvg==",
+          "requires": {
+            "@turf/helpers": "6.x",
+            "@turf/invariant": "6.x"
+          }
+        },
+        "@turf/helpers": {
+          "version": "6.1.4",
+          "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.1.4.tgz",
+          "integrity": "sha512-vJvrdOZy1ngC7r3MDA7zIGSoIgyrkWcGnNIEaqn/APmw+bVLF2gAW7HIsdTxd12s5wQMqEpqIQrmrbRRZ0xC7g=="
+        },
+        "@turf/invariant": {
+          "version": "6.1.2",
+          "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.1.2.tgz",
+          "integrity": "sha512-WU08Ph8j0J2jVGlQCKChXoCtI50BB3yEH21V++V0T4cR1T27HKCxkehV2sYMwTierfMBgjwSwDIsxnR4/2mWXg==",
+          "requires": {
+            "@turf/helpers": "6.x"
+          }
+        },
+        "@turf/meta": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.0.2.tgz",
+          "integrity": "sha512-VA7HJkx7qF1l3+GNGkDVn2oXy4+QoLP6LktXAaZKjuT1JI0YESat7quUkbCMy4zP9lAUuvS4YMslLyTtr919FA==",
+          "requires": {
+            "@turf/helpers": "6.x"
+          }
+        },
+        "@turf/projection": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-6.0.1.tgz",
+          "integrity": "sha512-Y3RvGT6I53MjYKLG69e9sMk45wJXcLbrEO1t6P3WQQQGqA2gYhhMJyV41vE2Z2llrJpvs2dDx/tIeQzGd0HHMQ==",
+          "requires": {
+            "@turf/clone": "6.x",
+            "@turf/helpers": "6.x",
+            "@turf/meta": "6.x"
+          }
+        },
+        "@turf/rhumb-bearing": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-6.0.1.tgz",
+          "integrity": "sha512-MVBra8OVfjM4+/N0B3o6cBIYg9p/uRKzA9uk05RfrzasEbUL1vdD23LkTooVL74Yw4UxL8BQD9hS5Re2COJFDA==",
+          "requires": {
+            "@turf/helpers": "6.x",
+            "@turf/invariant": "6.x"
+          }
+        },
+        "@turf/rhumb-distance": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-6.0.1.tgz",
+          "integrity": "sha512-3G45DQtQByzzfHFPcCyJdUZFwsd45zfZ7sAb1ddF7mhEj4G70+T2G3GKjInymqDNrbyh2gbG6wQiZSToC8Uf9g==",
+          "requires": {
+            "@turf/helpers": "6.x",
+            "@turf/invariant": "6.x"
+          }
+        }
+      }
+    },
+    "@turf/points-within-polygon": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/points-within-polygon/-/points-within-polygon-5.1.5.tgz",
+      "integrity": "sha1-K4VaXfOq2lfC7oIKB1SrlJKKIzc=",
+      "requires": {
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/polygon-tangents": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/polygon-tangents/-/polygon-tangents-5.1.5.tgz",
+      "integrity": "sha1-K/AJkUcwJbF44lDcfLmuVAm71lI=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/polygon-to-line": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-5.1.5.tgz",
+      "integrity": "sha1-I7tEjYTcTGUZmaxhGjbZHFklA2o=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/polygonize": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/polygonize/-/polygonize-5.1.5.tgz",
+      "integrity": "sha1-BJP6EYefOdELmtAs5qI+lC0IqjI=",
+      "requires": {
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/envelope": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/projection": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-5.1.5.tgz",
+      "integrity": "sha1-JFF+7rLzaBa6n3EueubWo2jt91c=",
+      "requires": {
+        "@turf/clone": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/random": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/random/-/random-5.1.5.tgz",
+      "integrity": "sha1-sy78k0Vgroulfo67UfJBw5+6Lns=",
+      "requires": {
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/rewind": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-5.1.5.tgz",
+      "integrity": "sha1-nqPbSmi3PB/R3RH1djGxQ8/vock=",
+      "requires": {
+        "@turf/boolean-clockwise": "^5.1.5",
+        "@turf/clone": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/rhumb-bearing": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-5.1.5.tgz",
+      "integrity": "sha1-rPalAkJ+uMSeGM2mrg7/qwxd3NI=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/rhumb-destination": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-5.1.5.tgz",
+      "integrity": "sha1-sbKuuSFUfyrAwamUtqEw+SRjx0I=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/rhumb-distance": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-5.1.5.tgz",
+      "integrity": "sha1-GAaFdiX0IlOE2tQT5p85U4/192U=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/sample": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/sample/-/sample-5.1.5.tgz",
+      "integrity": "sha1-6ctEikeJzFbuPeLdZ4HiNDQ1tBE=",
+      "requires": {
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/sector": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/sector/-/sector-5.1.5.tgz",
+      "integrity": "sha1-rCu5TBPt1gNPb9wrZwCBNdIPXgc=",
+      "requires": {
+        "@turf/circle": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/line-arc": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/shortest-path": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/shortest-path/-/shortest-path-5.1.5.tgz",
+      "integrity": "sha1-hUroCW9rw+EwD6ynfz6PZ9j5Nas=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/bbox-polygon": "^5.1.5",
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/clean-coords": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/transform-scale": "^5.1.5"
+      }
+    },
+    "@turf/simplify": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/simplify/-/simplify-5.1.5.tgz",
+      "integrity": "sha1-Csjyei60IYGD7dmZjDJ1q+QIuSY=",
+      "requires": {
+        "@turf/clean-coords": "^5.1.5",
+        "@turf/clone": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/square": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/square/-/square-5.1.5.tgz",
+      "integrity": "sha1-qnsh5gM8ySUsOlvW89iNq9b+0YA=",
+      "requires": {
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/square-grid": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/square-grid/-/square-grid-5.1.5.tgz",
+      "integrity": "sha1-G9X3uesU8LYLwjH+/nNR0aMvGlE=",
+      "requires": {
+        "@turf/boolean-contains": "^5.1.5",
+        "@turf/boolean-overlap": "^5.1.5",
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/intersect": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/standard-deviational-ellipse": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/standard-deviational-ellipse/-/standard-deviational-ellipse-5.1.5.tgz",
+      "integrity": "sha1-hc0oO14ayljyG9ZkEuQUtW2FIyQ=",
+      "requires": {
+        "@turf/center-mean": "^5.1.5",
+        "@turf/ellipse": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/points-within-polygon": "^5.1.5"
+      }
+    },
+    "@turf/tag": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/tag/-/tag-5.1.5.tgz",
+      "integrity": "sha1-0e4aUIjs/UoUEQGcmCOczypJfSA=",
+      "requires": {
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/clone": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/tesselate": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/tesselate/-/tesselate-5.1.5.tgz",
+      "integrity": "sha1-MqWU6cIaAEIKn5DSxD3z4RZgYc0=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "earcut": "^2.0.0"
+      }
+    },
+    "@turf/tin": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/tin/-/tin-5.1.5.tgz",
+      "integrity": "sha1-KCI+r8X76a6azKgc3P6l0UJMkX0=",
+      "requires": {
+        "@turf/helpers": "^5.1.5"
+      }
+    },
+    "@turf/transform-rotate": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-5.1.5.tgz",
+      "integrity": "sha1-0Jbt2eMA/jFQadVNjkWMQJIh7fs=",
+      "requires": {
+        "@turf/centroid": "^5.1.5",
+        "@turf/clone": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/rhumb-bearing": "^5.1.5",
+        "@turf/rhumb-destination": "^5.1.5",
+        "@turf/rhumb-distance": "^5.1.5"
+      }
+    },
+    "@turf/transform-scale": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/transform-scale/-/transform-scale-5.1.5.tgz",
+      "integrity": "sha1-cP064BhWz3uunxWtVhzf6PiQAbk=",
+      "requires": {
+        "@turf/bbox": "^5.1.5",
+        "@turf/center": "^5.1.5",
+        "@turf/centroid": "^5.1.5",
+        "@turf/clone": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/rhumb-bearing": "^5.1.5",
+        "@turf/rhumb-destination": "^5.1.5",
+        "@turf/rhumb-distance": "^5.1.5"
+      }
+    },
+    "@turf/transform-translate": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-5.1.5.tgz",
+      "integrity": "sha1-Uwolf7Hccmja3Ks05nkB6yo97GM=",
+      "requires": {
+        "@turf/clone": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "@turf/rhumb-destination": "^5.1.5"
+      }
+    },
+    "@turf/triangle-grid": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/triangle-grid/-/triangle-grid-5.1.5.tgz",
+      "integrity": "sha1-ezZ2IQhVTBTyjK/zxIsc/ILI3IE=",
+      "requires": {
+        "@turf/distance": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/intersect": "^5.1.5",
+        "@turf/invariant": "^5.1.5"
+      }
+    },
+    "@turf/truncate": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/truncate/-/truncate-5.1.5.tgz",
+      "integrity": "sha1-nu37Oxi6gfLJjT6tCUMcyhiErYk=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5"
+      }
+    },
+    "@turf/turf": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/@turf/turf/-/turf-5.1.6.tgz",
+      "integrity": "sha1-wxIlkoh+0jS3VGi4qMRb+Ib7+PY=",
+      "requires": {
+        "@turf/along": "5.1.x",
+        "@turf/area": "5.1.x",
+        "@turf/bbox": "5.1.x",
+        "@turf/bbox-clip": "5.1.x",
+        "@turf/bbox-polygon": "5.1.x",
+        "@turf/bearing": "5.1.x",
+        "@turf/bezier-spline": "5.1.x",
+        "@turf/boolean-clockwise": "5.1.x",
+        "@turf/boolean-contains": "5.1.x",
+        "@turf/boolean-crosses": "5.1.x",
+        "@turf/boolean-disjoint": "5.1.x",
+        "@turf/boolean-equal": "5.1.x",
+        "@turf/boolean-overlap": "5.1.x",
+        "@turf/boolean-parallel": "5.1.x",
+        "@turf/boolean-point-in-polygon": "5.1.x",
+        "@turf/boolean-point-on-line": "5.1.x",
+        "@turf/boolean-within": "5.1.x",
+        "@turf/buffer": "5.1.x",
+        "@turf/center": "5.1.x",
+        "@turf/center-mean": "5.1.x",
+        "@turf/center-median": "5.1.x",
+        "@turf/center-of-mass": "5.1.x",
+        "@turf/centroid": "5.1.x",
+        "@turf/circle": "5.1.x",
+        "@turf/clean-coords": "5.1.x",
+        "@turf/clone": "5.1.x",
+        "@turf/clusters": "5.1.x",
+        "@turf/clusters-dbscan": "5.1.x",
+        "@turf/clusters-kmeans": "5.1.x",
+        "@turf/collect": "5.1.x",
+        "@turf/combine": "5.1.x",
+        "@turf/concave": "5.1.x",
+        "@turf/convex": "5.1.x",
+        "@turf/destination": "5.1.x",
+        "@turf/difference": "5.1.x",
+        "@turf/dissolve": "5.1.x",
+        "@turf/distance": "5.1.x",
+        "@turf/ellipse": "5.1.x",
+        "@turf/envelope": "5.1.x",
+        "@turf/explode": "5.1.x",
+        "@turf/flatten": "5.1.x",
+        "@turf/flip": "5.1.x",
+        "@turf/great-circle": "5.1.x",
+        "@turf/helpers": "5.1.x",
+        "@turf/hex-grid": "5.1.x",
+        "@turf/interpolate": "5.1.x",
+        "@turf/intersect": "5.1.x",
+        "@turf/invariant": "5.1.x",
+        "@turf/isobands": "5.1.x",
+        "@turf/isolines": "5.1.x",
+        "@turf/kinks": "5.1.x",
+        "@turf/length": "5.1.x",
+        "@turf/line-arc": "5.1.x",
+        "@turf/line-chunk": "5.1.x",
+        "@turf/line-intersect": "5.1.x",
+        "@turf/line-offset": "5.1.x",
+        "@turf/line-overlap": "5.1.x",
+        "@turf/line-segment": "5.1.x",
+        "@turf/line-slice": "5.1.x",
+        "@turf/line-slice-along": "5.1.x",
+        "@turf/line-split": "5.1.x",
+        "@turf/line-to-polygon": "5.1.x",
+        "@turf/mask": "5.1.x",
+        "@turf/meta": "5.1.x",
+        "@turf/midpoint": "5.1.x",
+        "@turf/nearest-point": "5.1.x",
+        "@turf/nearest-point-on-line": "5.1.x",
+        "@turf/nearest-point-to-line": "5.1.x",
+        "@turf/planepoint": "5.1.x",
+        "@turf/point-grid": "5.1.x",
+        "@turf/point-on-feature": "5.1.x",
+        "@turf/point-to-line-distance": "5.1.x",
+        "@turf/points-within-polygon": "5.1.x",
+        "@turf/polygon-tangents": "5.1.x",
+        "@turf/polygon-to-line": "5.1.x",
+        "@turf/polygonize": "5.1.x",
+        "@turf/projection": "5.1.x",
+        "@turf/random": "5.1.x",
+        "@turf/rewind": "5.1.x",
+        "@turf/rhumb-bearing": "5.1.x",
+        "@turf/rhumb-destination": "5.1.x",
+        "@turf/rhumb-distance": "5.1.x",
+        "@turf/sample": "5.1.x",
+        "@turf/sector": "5.1.x",
+        "@turf/shortest-path": "5.1.x",
+        "@turf/simplify": "5.1.x",
+        "@turf/square": "5.1.x",
+        "@turf/square-grid": "5.1.x",
+        "@turf/standard-deviational-ellipse": "5.1.x",
+        "@turf/tag": "5.1.x",
+        "@turf/tesselate": "5.1.x",
+        "@turf/tin": "5.1.x",
+        "@turf/transform-rotate": "5.1.x",
+        "@turf/transform-scale": "5.1.x",
+        "@turf/transform-translate": "5.1.x",
+        "@turf/triangle-grid": "5.1.x",
+        "@turf/truncate": "5.1.x",
+        "@turf/union": "5.1.x",
+        "@turf/unkink-polygon": "5.1.x",
+        "@turf/voronoi": "5.1.x"
+      }
+    },
+    "@turf/union": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/union/-/union-5.1.5.tgz",
+      "integrity": "sha1-UyhbYJQEf8WNlqrA6pCGXsNNRUs=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "turf-jsts": "*"
+      }
+    },
+    "@turf/unkink-polygon": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/unkink-polygon/-/unkink-polygon-5.1.5.tgz",
+      "integrity": "sha1-ewGEfFD7V0riV54Z5Ey6hSbSE8M=",
+      "requires": {
+        "@turf/area": "^5.1.5",
+        "@turf/boolean-point-in-polygon": "^5.1.5",
+        "@turf/helpers": "^5.1.5",
+        "@turf/meta": "^5.1.5",
+        "rbush": "^2.0.1"
+      }
+    },
+    "@turf/voronoi": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/@turf/voronoi/-/voronoi-5.1.5.tgz",
+      "integrity": "sha1-6FbpQG3MLyXWbdyJhYTifC6/ymY=",
+      "requires": {
+        "@turf/helpers": "^5.1.5",
+        "@turf/invariant": "^5.1.5",
+        "d3-voronoi": "1.1.2"
+      }
+    },
+    "@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/bunyan": {
+      "version": "0.0.36",
+      "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-0.0.36.tgz",
+      "integrity": "sha1-/dhlxY6OqvCtQBzQMtyGH1xXNCo=",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@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": "*",
+        "@types/jquery": "*"
+      }
+    },
+    "@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": "*"
+      }
+    },
+    "@types/form-data": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz",
+      "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/jest": {
+      "version": "24.0.6",
+      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.6.tgz",
+      "integrity": "sha512-NE7FBG/F4cMDKdCBqgyd+Sa6JZ5GiMOyA5QwJdeS4Ii/Z9a18WgGbFrHbcr48/7I9HdnkaAYP+S2MmQ27qoqJA==",
+      "dev": true,
+      "requires": {
+        "@types/jest-diff": "*"
+      }
+    },
+    "@types/jest-diff": {
+      "version": "20.0.1",
+      "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-20.0.1.tgz",
+      "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==",
+      "dev": true
+    },
+    "@types/jest-each": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/@types/jest-each/-/jest-each-0.3.4.tgz",
+      "integrity": "sha512-ZHTN/i7aLE0Bae73slS88oM8sucx1D2pXLZ5UAwrVzv2LHfNnzmxz1KwdjJ4cHomIxU1Z+M3kSbj7FLVD56K5A==",
+      "dev": true
+    },
+    "@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/jwt-decode": {
+      "version": "1.4.30",
+      "resolved": "https://registry.npmjs.org/@types/jwt-decode/-/jwt-decode-1.4.30.tgz",
+      "integrity": "sha512-vmBy38tpxTDimkD+YP5i6gyvjD/sIVj8CNuTKjbDJ28LOkAisv0NDoKbfnSwRq+SYWza6bpie0C4lI7pkCbDIg=="
+    },
+    "@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.3",
+      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+      "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
+    },
+    "@types/node": {
+      "version": "10.12.18",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz",
+      "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ=="
+    },
+    "@types/request": {
+      "version": "0.0.45",
+      "resolved": "https://registry.npmjs.org/@types/request/-/request-0.0.45.tgz",
+      "integrity": "sha512-OIIREjT58pnpfJjEY5PeBEuRtRR2ED4DF1Ez3Dj9474kCqEKfE+iNAYyM/P3RxxDjNxBhipo+peNBW0S/7Wrzg==",
+      "requires": {
+        "@types/form-data": "*",
+        "@types/node": "*"
+      }
+    },
+    "@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": "*",
+        "@types/sinon": "*"
+      }
+    },
+    "@types/uuid": {
+      "version": "3.4.4",
+      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.4.tgz",
+      "integrity": "sha512-tPIgT0GUmdJQNSHxp0X2jnpQfBSTfGxUMc/2CXBU2mnyTFVYVa2ojpoQ74w0U2yn2vw3jnC640+77lkFFpdVDw==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@webassemblyjs/ast": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz",
+      "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/helper-module-context": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/wast-parser": "1.7.11"
+      }
+    },
+    "@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz",
+      "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz",
+      "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz",
+      "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-code-frame": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz",
+      "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/wast-printer": "1.7.11"
+      }
+    },
+    "@webassemblyjs/helper-fsm": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz",
+      "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-module-context": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz",
+      "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz",
+      "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz",
+      "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-buffer": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/wasm-gen": "1.7.11"
+      }
+    },
+    "@webassemblyjs/ieee754": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz",
+      "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==",
+      "dev": true,
+      "requires": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "@webassemblyjs/leb128": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz",
+      "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==",
+      "dev": true,
+      "requires": {
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@webassemblyjs/utf8": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz",
+      "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==",
+      "dev": true
+    },
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz",
+      "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-buffer": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/helper-wasm-section": "1.7.11",
+        "@webassemblyjs/wasm-gen": "1.7.11",
+        "@webassemblyjs/wasm-opt": "1.7.11",
+        "@webassemblyjs/wasm-parser": "1.7.11",
+        "@webassemblyjs/wast-printer": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wasm-gen": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz",
+      "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/ieee754": "1.7.11",
+        "@webassemblyjs/leb128": "1.7.11",
+        "@webassemblyjs/utf8": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wasm-opt": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz",
+      "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-buffer": "1.7.11",
+        "@webassemblyjs/wasm-gen": "1.7.11",
+        "@webassemblyjs/wasm-parser": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wasm-parser": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz",
+      "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-api-error": "1.7.11",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.11",
+        "@webassemblyjs/ieee754": "1.7.11",
+        "@webassemblyjs/leb128": "1.7.11",
+        "@webassemblyjs/utf8": "1.7.11"
+      }
+    },
+    "@webassemblyjs/wast-parser": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz",
+      "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/floating-point-hex-parser": "1.7.11",
+        "@webassemblyjs/helper-api-error": "1.7.11",
+        "@webassemblyjs/helper-code-frame": "1.7.11",
+        "@webassemblyjs/helper-fsm": "1.7.11",
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@webassemblyjs/wast-printer": {
+      "version": "1.7.11",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz",
+      "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/wast-parser": "1.7.11",
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "dev": true
+    },
+    "@xtuc/long": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz",
+      "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==",
+      "dev": true
+    },
+    "@yarnpkg/lockfile": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+      "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
+      "dev": true
+    },
+    "JSONStream": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+      "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+      "dev": true,
+      "requires": {
+        "jsonparse": "^1.2.0",
+        "through": ">=2.2.7 <3"
+      }
+    },
+    "abab": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz",
+      "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==",
+      "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=="
+    },
+    "accepts": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+      "dev": true,
+      "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==",
+      "dev": true
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "acorn": "^4.0.3"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "4.0.13",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+          "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+          "dev": true
+        }
+      }
+    },
+    "acorn-globals": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz",
+      "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==",
+      "dev": true,
+      "requires": {
+        "acorn": "^6.0.1",
+        "acorn-walk": "^6.0.1"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.0.tgz",
+          "integrity": "sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw==",
+          "dev": true
+        }
+      }
+    },
+    "acorn-walk": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz",
+      "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==",
+      "dev": true
+    },
+    "agent-base": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
+      "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
+      "dev": true,
+      "requires": {
+        "es6-promisify": "^5.0.0"
+      }
+    },
+    "agentkeepalive": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz",
+      "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==",
+      "dev": true,
+      "requires": {
+        "humanize-ms": "^1.2.1"
+      }
+    },
+    "ajv": {
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz",
+      "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "^2.0.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "dependencies": {
+        "fast-deep-equal": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+          "dev": true
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true
+        }
+      }
+    },
+    "ajv-errors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+      "dev": true
+    },
+    "ajv-keywords": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
+      "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
+      "dev": true
+    },
+    "align-text": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.0.2",
+        "longest": "^1.0.1",
+        "repeat-string": "^1.5.2"
+      }
+    },
+    "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=",
+      "dev": true
+    },
+    "angular-base64-upload": {
+      "version": "0.1.23",
+      "resolved": "https://registry.npmjs.org/angular-base64-upload/-/angular-base64-upload-0.1.23.tgz",
+      "integrity": "sha512-vRSY+7/pag2hEdTSB90LTvT5rU5XPxBNMA1WGz60pNSpChRUzf+h5FR9lObRcGg1WUOvlYinnvoPTD6Nktcx1g==",
+      "dev": 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": ">=3",
+        "mobx-angular": ">=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.0.0"
+      }
+    },
+    "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": "*"
+      }
+    },
+    "angular2-template-loader": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/angular2-template-loader/-/angular2-template-loader-0.6.2.tgz",
+      "integrity": "sha1-wNROkP/w+sleiyPwQ6zaf9HFHXw=",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^0.2.15"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "0.2.17",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+          "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+          "dev": true,
+          "requires": {
+            "big.js": "^3.1.3",
+            "emojis-list": "^2.0.0",
+            "json5": "^0.5.0",
+            "object-assign": "^4.0.1"
+          }
+        }
+      }
+    },
+    "angular5-csv": {
+      "version": "0.2.10",
+      "resolved": "https://registry.npmjs.org/angular5-csv/-/angular5-csv-0.2.10.tgz",
+      "integrity": "sha512-hLEXyYjocQWev8e9P1LMWny3PxCtzeXvHUjiRGwMXUP8myByrFXf+B5taJFvlgTKsIONFu2wmRsTjjpyB2O1Yw=="
+    },
+    "ansi-colors": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
+      "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "3.1.0",
+      "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+      "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
+      "dev": true
+    },
+    "ansi-html": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+      "dev": true
+    },
+    "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.0"
+      }
+    },
+    "ansicolors": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz",
+      "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8="
+    },
+    "ansistyles": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz",
+      "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk="
+    },
+    "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.1.5",
+        "normalize-path": "^2.0.0"
+      }
+    },
+    "app-root-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz",
+      "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=",
+      "dev": true
+    },
+    "append-transform": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz",
+      "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==",
+      "dev": true,
+      "requires": {
+        "default-require-extensions": "^2.0.0"
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true
+    },
+    "archy": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
+    },
+    "are-we-there-yet": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+      "dev": true,
+      "requires": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^2.0.6"
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "args": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/args/-/args-2.6.1.tgz",
+      "integrity": "sha1-slkO1BaM0xtiREGZvcUWa7GSDC8=",
+      "requires": {
+        "camelcase": "4.1.0",
+        "chalk": "1.1.3",
+        "minimist": "1.2.0",
+        "pkginfo": "0.4.0",
+        "string-similarity": "1.1.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+        }
+      }
+    },
+    "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.0.1"
+      }
+    },
+    "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==",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
+    "array-differ": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.0.3.tgz",
+      "integrity": "sha1-AZW7AMzM8nEQbv7kpHhkiLcYBxI=",
+      "dev": true
+    },
+    "array-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
+      "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
+      "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-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,
+      "optional": true
+    },
+    "array-flatten": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+      "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+      "dev": true
+    },
+    "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-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.1"
+      }
+    },
+    "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
+    },
+    "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="
+    },
+    "asn1.js": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "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=",
+      "dev": true,
+      "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="
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "ast-traverse": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz",
+      "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY="
+    },
+    "astral-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+      "dev": 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.14.0"
+      }
+    },
+    "async-each": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+      "dev": true
+    },
+    "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="
+    },
+    "atob": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz",
+      "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "9.3.1",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.3.1.tgz",
+      "integrity": "sha512-DY9gOh8z3tnCbJ13JIWaeQsoYncTGdsrgCceBaQSIL4nvdrLxgbRSBPevg2XbX7u4QCSfLheSJEEIUUSlkbx6Q==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.3.3",
+        "caniuse-lite": "^1.0.30000898",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "postcss": "^7.0.5",
+        "postcss-value-parser": "^3.3.1"
+      },
+      "dependencies": {
+        "browserslist": {
+          "version": "4.3.6",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.6.tgz",
+          "integrity": "sha512-kMGKs4BTzRWviZ8yru18xBpx+CyHG9eqgRbj9XbE3IMgtczf4aiA0Y1YCpVdvUieKGZ03kolSPXqTcscBCb9qw==",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "^1.0.30000921",
+            "electron-to-chromium": "^1.3.92",
+            "node-releases": "^1.1.1"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30000923",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000923.tgz",
+          "integrity": "sha512-j5ur7eeluOFjjPUkydtXP4KFAsmH3XaQNch5tvWSO+dLHYt5PE+VgJZLWtbVOodfWij6m6zas28T4gB/cLYq1w==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.96",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.96.tgz",
+          "integrity": "sha512-ZUXBUyGLeoJxp4Nt6G/GjBRLnyz8IKQGexZ2ndWaoegThgMGFO1tdDYID5gBV32/1S83osjJHyfzvanE/8HY4Q==",
+          "dev": true
+        }
+      }
+    },
+    "aws-sign2": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+      "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8="
+    },
+    "aws4": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+      "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4="
+    },
+    "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.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "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.0",
+        "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.0",
+        "debug": "^2.6.8",
+        "json5": "^0.5.1",
+        "lodash": "^4.17.4",
+        "minimatch": "^3.0.4",
+        "path-is-absolute": "^1.0.1",
+        "private": "^0.1.7",
+        "slash": "^1.0.0",
+        "source-map": "^0.5.6"
+      }
+    },
+    "babel-generator": {
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+      "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.4",
+        "source-map": "^0.5.7",
+        "trim-right": "^1.0.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-explode-assignable-expression": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-hoist-variables": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "^6.24.1",
+        "babel-runtime": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "lodash": "^4.17.4"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-get-function-arity": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "lodash": "^4.17.4"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-optimise-call-expression": "^6.24.1",
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "babel-jest": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.1.0.tgz",
+      "integrity": "sha512-MLcagnVrO9ybQGLEfZUqnOzv36iQzU7Bj4elm39vCukumLVSfoX+tRy3/jW7lUKc7XdpRmB/jech6L/UCsSZjw==",
+      "dev": true,
+      "requires": {
+        "babel-plugin-istanbul": "^5.1.0",
+        "babel-preset-jest": "^24.1.0",
+        "chalk": "^2.4.2",
+        "slash": "^2.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "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
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "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.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-istanbul": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz",
+      "integrity": "sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ==",
+      "dev": true,
+      "requires": {
+        "find-up": "^3.0.0",
+        "istanbul-lib-instrument": "^3.0.0",
+        "test-exclude": "^5.0.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.3.tgz",
+          "integrity": "sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.3.3",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.11",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.3.tgz",
+          "integrity": "sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+          "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.2.2",
+            "@babel/helper-function-name": "^7.1.0",
+            "@babel/helper-split-export-declaration": "^7.0.0",
+            "@babel/parser": "^7.2.3",
+            "@babel/types": "^7.2.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.10"
+          }
+        },
+        "@babel/types": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.3.tgz",
+          "integrity": "sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.11",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "globals": {
+          "version": "11.11.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz",
+          "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==",
+          "dev": true
+        },
+        "istanbul-lib-coverage": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+          "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==",
+          "dev": true
+        },
+        "istanbul-lib-instrument": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz",
+          "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==",
+          "dev": true,
+          "requires": {
+            "@babel/generator": "^7.0.0",
+            "@babel/parser": "^7.0.0",
+            "@babel/template": "^7.0.0",
+            "@babel/traverse": "^7.0.0",
+            "@babel/types": "^7.0.0",
+            "istanbul-lib-coverage": "^2.0.3",
+            "semver": "^5.5.0"
+          }
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "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==",
+          "dev": true
+        },
+        "p-limit": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz",
+          "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
+      }
+    },
+    "babel-plugin-jest-hoist": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.1.0.tgz",
+      "integrity": "sha512-gljYrZz8w1b6fJzKcsfKsipSru2DU2DmQ39aB6nV3xQ0DDv3zpIzKGortA5gknrhNnPN8DweaEgrnZdmbGmhnw==",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-remap-async-to-generator": "^6.24.1",
+        "babel-plugin-syntax-async-functions": "^6.8.0",
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "babel-template": "^6.26.0",
+        "babel-traverse": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "lodash": "^4.17.4"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-define-map": "^6.24.1",
+        "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.22.0",
+        "babel-template": "^6.24.1",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-hoist-variables": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-replace-supers": "^6.24.1",
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-call-delegate": "^6.24.1",
+        "babel-helper-get-function-arity": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-template": "^6.24.1",
+        "babel-traverse": "^6.24.1",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-regex": "^6.24.1",
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-regex": "^6.24.1",
+        "babel-runtime": "^6.22.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=",
+          "dev": true,
+          "requires": {
+            "regenerate": "^1.2.1",
+            "regjsgen": "^0.2.0",
+            "regjsparser": "^0.1.4"
+          }
+        }
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+        "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-flow": "^6.18.0",
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-helper-builder-react-jsx": "^6.24.1",
+        "babel-plugin-syntax-jsx": "^6.8.0",
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-jsx": "^6.8.0",
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-jsx": "^6.8.0",
+        "babel-runtime": "^6.22.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=",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "^0.10.0"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-flow-strip-types": "^6.22.0"
+      }
+    },
+    "babel-preset-jest": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.1.0.tgz",
+      "integrity": "sha512-FfNLDxFWsNX9lUmtwY7NheGlANnagvxq8LZdl5PKnVG3umP+S/g0XbVBfwtA4Ai3Ri/IMkWabBz3Tyk9wdspcw==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
+        "babel-plugin-jest-hoist": "^24.1.0"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-jsx": "^6.3.13",
+        "babel-plugin-transform-react-display-name": "^6.23.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-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.0",
+        "home-or-tmp": "^2.0.0",
+        "lodash": "^4.17.4",
+        "mkdirp": "^0.5.1",
+        "source-map-support": "^0.4.15"
+      },
+      "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.0",
+        "regenerator-runtime": "^0.11.0"
+      }
+    },
+    "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.4"
+      }
+    },
+    "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.8",
+        "globals": "^9.18.0",
+        "invariant": "^2.2.2",
+        "lodash": "^4.17.4"
+      }
+    },
+    "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.4",
+        "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=="
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "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=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "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==",
+      "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=",
+      "optional": true,
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "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=",
+      "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.0"
+      }
+    },
+    "bluebird": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
+      "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "4.11.8",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.18.3",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
+      "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "~1.6.3",
+        "iconv-lite": "0.4.23",
+        "on-finished": "~2.3.0",
+        "qs": "6.5.2",
+        "raw-body": "2.3.3",
+        "type-is": "~1.6.16"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.23",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+          "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true
+        }
+      }
+    },
+    "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.0",
+        "deep-equal": "^1.0.1",
+        "dns-equal": "^1.0.0",
+        "dns-txt": "^2.0.2",
+        "multicast-dns": "^6.0.1",
+        "multicast-dns-service-types": "^1.1.0"
+      }
+    },
+    "boom": {
+      "version": "2.10.1",
+      "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+      "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+      "requires": {
+        "hoek": "2.x.x"
+      }
+    },
+    "bootstrap": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz",
+      "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E="
+    },
+    "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.1",
+        "preserve": "^0.2.0",
+        "repeat-element": "^1.1.2"
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
+    },
+    "browser-process-hrtime": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz",
+      "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==",
+      "dev": true
+    },
+    "browser-resolve": {
+      "version": "1.11.3",
+      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
+      "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
+      "dev": true,
+      "requires": {
+        "resolve": "1.1.7"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.1.7",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+          "dev": true
+        }
+      }
+    },
+    "browserify-aes": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz",
+      "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==",
+      "dev": true,
+      "requires": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz",
+      "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=",
+      "dev": true,
+      "requires": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz",
+      "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "randombytes": "^2.0.1"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.1",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.2",
+        "elliptic": "^6.0.0",
+        "inherits": "^2.0.1",
+        "parse-asn1": "^5.0.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==",
+      "dev": true,
+      "requires": {
+        "pako": "~1.0.5"
+      }
+    },
+    "browserslist": {
+      "version": "2.11.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz",
+      "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "^1.0.30000792",
+        "electron-to-chromium": "^1.3.30"
+      }
+    },
+    "bser": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz",
+      "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=",
+      "dev": true,
+      "requires": {
+        "node-int64": "^0.4.0"
+      }
+    },
+    "buffer": {
+      "version": "4.9.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+      "dev": true,
+      "requires": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "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-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+      "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-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "builtins": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
+      "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
+      "dev": true
+    },
+    "bunyan": {
+      "version": "1.8.12",
+      "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz",
+      "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=",
+      "requires": {
+        "dtrace-provider": "~0.8",
+        "moment": "^2.10.6",
+        "mv": "~2",
+        "safe-json-stringify": "~1"
+      }
+    },
+    "bunyan-blackhole": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/bunyan-blackhole/-/bunyan-blackhole-1.1.1.tgz",
+      "integrity": "sha1-uSCFhtwLTkf09xMhWxvd1l5PYlc=",
+      "requires": {
+        "stream-blackhole": "^1.0.3"
+      }
+    },
+    "bunyan-format": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/bunyan-format/-/bunyan-format-0.2.1.tgz",
+      "integrity": "sha1-pLOw2ABwqGUnlBcmnj8A/wL7y0c=",
+      "requires": {
+        "ansicolors": "~0.2.1",
+        "ansistyles": "~0.1.1",
+        "xtend": "~2.1.1"
+      },
+      "dependencies": {
+        "object-keys": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+          "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY="
+        },
+        "xtend": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
+          "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
+          "requires": {
+            "object-keys": "~0.4.0"
+          }
+        }
+      }
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+      "dev": true
+    },
+    "cacache": {
+      "version": "10.0.4",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
+      "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.1",
+        "chownr": "^1.0.1",
+        "glob": "^7.1.2",
+        "graceful-fs": "^4.1.11",
+        "lru-cache": "^4.1.1",
+        "mississippi": "^2.0.0",
+        "mkdirp": "^0.5.1",
+        "move-concurrently": "^1.0.1",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^2.6.2",
+        "ssri": "^5.2.4",
+        "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==",
+      "dev": true,
+      "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=",
+          "dev": true
+        }
+      }
+    },
+    "cachedir": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-1.3.0.tgz",
+      "integrity": "sha512-O1ji32oyON9laVPJL1IZ5bmwd2cB46VfpxkDequezH+15FDzzVddEyrGEeX4WusDSqKxdyFdDQDEG1yo1GoWkg==",
+      "dev": true,
+      "requires": {
+        "os-homedir": "^1.0.1"
+      }
+    },
+    "caller-callsite": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
+      "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+      "dev": true,
+      "requires": {
+        "callsites": "^2.0.0"
+      }
+    },
+    "caller-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
+      "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
+      "dev": true,
+      "requires": {
+        "caller-callsite": "^2.0.0"
+      }
+    },
+    "callsites": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+      "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
+      "dev": true
+    },
+    "camelcase": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "dev": true,
+      "optional": 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,
+      "optional": true,
+      "requires": {
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
+      }
+    },
+    "caniuse-lite": {
+      "version": "1.0.30000815",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000815.tgz",
+      "integrity": "sha512-PGSOPK6gFe5fWd+eD0u2bG0aOsN1qC4B1E66tl3jOsIoKkTIcBYAc2+O6AeNzKW8RsFykWgnhkTlfOyuTzgI9A==",
+      "dev": true
+    },
+    "canonical-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz",
+      "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==",
+      "dev": true
+    },
+    "capture-exit": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz",
+      "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=",
+      "dev": true,
+      "requires": {
+        "rsvp": "^3.3.3"
+      }
+    },
+    "capture-stack-trace": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+      "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw=="
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+    },
+    "center-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+      "dev": true,
+      "requires": {
+        "align-text": "^0.1.3",
+        "lazy-cache": "^1.0.3"
+      }
+    },
+    "chalk": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz",
+      "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==",
+      "requires": {
+        "ansi-styles": "^3.1.0",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^4.0.0"
+      }
+    },
+    "chardet": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+      "dev": true
+    },
+    "charenc": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+      "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
+    },
+    "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.0",
+        "async-each": "^1.0.0",
+        "fsevents": "^1.0.0",
+        "glob-parent": "^2.0.0",
+        "inherits": "^2.0.1",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^2.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.0.0"
+      }
+    },
+    "chownr": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
+      "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
+      "dev": true
+    },
+    "chrome-trace-event": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz",
+      "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "circular-dependency-plugin": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz",
+      "integrity": "sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA==",
+      "dev": true
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "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=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.0.0"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "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
+        }
+      }
+    },
+    "clean-css": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
+      "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
+      "dev": true,
+      "requires": {
+        "source-map": "~0.6.0"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "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=",
+      "dev": true,
+      "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.1"
+      }
+    },
+    "cli-width": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+      "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.1",
+        "strip-ansi": "^3.0.1",
+        "wrap-ansi": "^2.0.0"
+      }
+    },
+    "clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+      "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.0",
+        "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.1"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "closest-file-data": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/closest-file-data/-/closest-file-data-0.1.4.tgz",
+      "integrity": "sha1-l1+HwTLymdJKA3W59jyj+4j3Kzo="
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+    },
+    "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=",
+      "dev": true
+    },
+    "codelyzer": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz",
+      "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==",
+      "dev": true,
+      "requires": {
+        "app-root-path": "^2.1.0",
+        "css-selector-tokenizer": "^0.7.0",
+        "cssauron": "^1.4.0",
+        "semver-dsl": "^1.0.1",
+        "source-map": "^0.5.7",
+        "sprintf-js": "^1.1.1"
+      },
+      "dependencies": {
+        "sprintf-js": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+          "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
+          "dev": true
+        }
+      }
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "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.1"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+    },
+    "combined-stream": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+      "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+      "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.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.18.0"
+      }
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
+    },
+    "compare-versions": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz",
+      "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==",
+      "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=",
+      "dev": true
+    },
+    "compressible": {
+      "version": "2.0.15",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz",
+      "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==",
+      "dev": true,
+      "requires": {
+        "mime-db": ">= 1.36.0 < 2"
+      },
+      "dependencies": {
+        "mime-db": {
+          "version": "1.37.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
+          "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
+          "dev": true
+        }
+      }
+    },
+    "compression": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
+      "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.14",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.1",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        }
+      }
+    },
+    "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.2",
+      "resolved": "http://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "concaveman": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/concaveman/-/concaveman-1.1.1.tgz",
+      "integrity": "sha1-bCSCWAslI874L8K+wAoEFebmgWI=",
+      "requires": {
+        "monotone-convex-hull-2d": "^1.0.1",
+        "point-in-polygon": "^1.0.1",
+        "rbush": "^2.0.1",
+        "robust-orientation": "^1.1.3",
+        "tinyqueue": "^1.1.0"
+      }
+    },
+    "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=",
+      "dev": true,
+      "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=",
+      "dev": true
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+      "dev": true
+    },
+    "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==",
+      "dev": true
+    },
+    "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="
+    },
+    "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=",
+      "dev": true
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1",
+        "fs-write-stream-atomic": "^1.0.8",
+        "iferr": "^0.1.5",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.0"
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
+    "copy-webpack-plugin": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz",
+      "integrity": "sha512-0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ==",
+      "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.0.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.6.1",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.1.tgz",
+      "integrity": "sha512-L72mmmEayPJBejKIWe2pYtGis5r0tQ5NaJekdhyXgeMQTpJoBsH0NL4ElY2LfSoV15xeQWKQ+XTTOZdyero5Xg=="
+    },
+    "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": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz",
+      "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==",
+      "dev": true,
+      "requires": {
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.9.0",
+        "parse-json": "^4.0.0",
+        "require-from-string": "^2.0.1"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        }
+      }
+    },
+    "create-ecdh": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz",
+      "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.0.0"
+      }
+    },
+    "create-error-class": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+      "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+      "requires": {
+        "capture-stack-trace": "^1.0.0"
+      }
+    },
+    "create-hash": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
+      "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz",
+      "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "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.0.1",
+        "which": "^1.2.9"
+      }
+    },
+    "crypt": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+      "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
+    },
+    "cryptiles": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+      "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+      "requires": {
+        "boom": "2.x.x"
+      }
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
+      }
+    },
+    "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-selector-tokenizer": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz",
+      "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==",
+      "dev": true,
+      "requires": {
+        "cssesc": "^0.1.0",
+        "fastparse": "^1.1.1",
+        "regexpu-core": "^1.0.0"
+      }
+    },
+    "cssauron": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
+      "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=",
+      "dev": true,
+      "requires": {
+        "through": "X.X.X"
+      }
+    },
+    "cssauron-falafel": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/cssauron-falafel/-/cssauron-falafel-1.2.1.tgz",
+      "integrity": "sha1-N7s/jpT9tKaaxadmgYajqEK+fc4=",
+      "requires": {
+        "cssauron": "1.1.0"
+      },
+      "dependencies": {
+        "cssauron": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.1.0.tgz",
+          "integrity": "sha1-HywscQi/POSaOe21CF7ByZxeJew=",
+          "requires": {
+            "through": "X.X.X"
+          }
+        }
+      }
+    },
+    "cssesc": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
+      "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
+      "dev": true
+    },
+    "cssom": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz",
+      "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==",
+      "dev": true
+    },
+    "cssstyle": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz",
+      "integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==",
+      "dev": true,
+      "requires": {
+        "cssom": "0.3.x"
+      }
+    },
+    "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,
+      "optional": true,
+      "requires": {
+        "array-find-index": "^1.0.1"
+      }
+    },
+    "cyclist": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
+      "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
+      "dev": true
+    },
+    "cypress": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.1.0.tgz",
+      "integrity": "sha512-UqLbXgHvM8Y6Y+roHrepZMWcyMN5u4KcjpTbJTZi0d5O2Prvtqmnpoky7a4C65q4oRQXeSc6cBZUhxJkhU4pbQ==",
+      "dev": true,
+      "requires": {
+        "@cypress/listr-verbose-renderer": "0.4.1",
+        "@cypress/xvfb": "1.2.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.3",
+        "@types/mocha": "2.2.44",
+        "@types/sinon": "4.0.0",
+        "@types/sinon-chai": "2.7.29",
+        "bluebird": "3.5.0",
+        "cachedir": "1.3.0",
+        "chalk": "2.4.1",
+        "check-more-types": "2.24.0",
+        "commander": "2.11.0",
+        "common-tags": "1.4.0",
+        "debug": "3.1.0",
+        "execa": "0.10.0",
+        "executable": "4.1.1",
+        "extract-zip": "1.6.6",
+        "fs-extra": "4.0.1",
+        "getos": "3.1.0",
+        "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.10",
+        "log-symbols": "2.2.0",
+        "minimist": "1.2.0",
+        "progress": "1.1.8",
+        "ramda": "0.24.1",
+        "request": "2.87.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
+        },
+        "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.0.0",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.3.0"
+          }
+        },
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        },
+        "aws-sign2": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+          "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+          "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.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.3.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "5.5.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "commander": {
+          "version": "2.11.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+          "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+          "dev": true
+        },
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "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"
+          }
+        },
+        "execa": {
+          "version": "0.10.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
+          "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+          "dev": true,
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.6",
+            "mime-types": "^2.1.12"
+          }
+        },
+        "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.2",
+            "jsonfile": "^3.0.0",
+            "universalify": "^0.1.0"
+          }
+        },
+        "har-schema": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+          "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+          "dev": true
+        },
+        "har-validator": {
+          "version": "5.0.3",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
+          "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+          "dev": true,
+          "requires": {
+            "ajv": "^5.1.0",
+            "har-schema": "^2.0.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
+        },
+        "http-signature": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+          "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+          "dev": true,
+          "requires": {
+            "assert-plus": "^1.0.0",
+            "jsprim": "^1.2.2",
+            "sshpk": "^1.7.0"
+          }
+        },
+        "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.6"
+          }
+        },
+        "lodash": {
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+          "dev": true
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "performance-now": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+          "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true
+        },
+        "request": {
+          "version": "2.87.0",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
+          "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
+          "dev": true,
+          "requires": {
+            "aws-sign2": "~0.7.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.3.1",
+            "har-validator": "~5.0.3",
+            "http-signature": "~1.2.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.17",
+            "oauth-sign": "~0.8.2",
+            "performance-now": "^2.1.0",
+            "qs": "~6.5.1",
+            "safe-buffer": "^5.1.1",
+            "tough-cookie": "~2.3.3",
+            "tunnel-agent": "^0.6.0",
+            "uuid": "^3.1.0"
+          }
+        },
+        "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"
+          },
+          "dependencies": {
+            "has-flag": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+              "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+              "dev": true
+            }
+          }
+        }
+      }
+    },
+    "d": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+      "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+      "dev": true,
+      "requires": {
+        "es5-ext": "^0.10.9"
+      }
+    },
+    "d3-array": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
+      "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
+    },
+    "d3-geo": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz",
+      "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==",
+      "requires": {
+        "d3-array": "1"
+      }
+    },
+    "d3-voronoi": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz",
+      "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw="
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "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="
+        }
+      }
+    },
+    "data-urls": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
+      "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.0",
+        "whatwg-mimetype": "^2.2.0",
+        "whatwg-url": "^7.0.0"
+      },
+      "dependencies": {
+        "whatwg-url": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz",
+          "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==",
+          "dev": true,
+          "requires": {
+            "lodash.sortby": "^4.7.0",
+            "tr46": "^1.0.1",
+            "webidl-conversions": "^4.0.2"
+          }
+        }
+      }
+    },
+    "date-fns": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz",
+      "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==",
+      "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=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "deep-equal": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
+    },
+    "deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+    },
+    "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="
+    },
+    "default-gateway": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz",
+      "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==",
+      "dev": true,
+      "requires": {
+        "execa": "^0.10.0",
+        "ip-regex": "^2.1.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "0.10.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
+          "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        }
+      }
+    },
+    "default-require-extensions": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
+      "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=",
+      "dev": true,
+      "requires": {
+        "strip-bom": "^3.0.0"
+      },
+      "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
+        }
+      }
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "dev": true,
+      "requires": {
+        "object-keys": "^1.0.12"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "dev": true,
+      "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=",
+          "dev": 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.1.1",
+        "pify": "^3.0.0",
+        "rimraf": "^2.2.8"
+      },
+      "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.1",
+            "glob": "^7.0.3",
+            "object-assign": "^4.0.1",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^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
+            }
+          }
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+      "dev": true
+    },
+    "density-clustering": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/density-clustering/-/density-clustering-1.3.0.tgz",
+      "integrity": "sha1-3J9ZyPCrl+FiSsZJMP0xlIF9ysU="
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true
+    },
+    "dependency-graph": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz",
+      "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==",
+      "dev": true
+    },
+    "des.js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "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=",
+      "dev": true
+    },
+    "detect-indent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+      "requires": {
+        "repeating": "^2.0.0"
+      }
+    },
+    "detect-newline": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+      "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
+      "dev": true
+    },
+    "detect-node": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
+      "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
+      "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
+    },
+    "diff-sequences": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.0.0.tgz",
+      "integrity": "sha512-46OkIuVGBBnrC0soO/4LHu5LHGHx0uhP65OVz8XOrAJpqiCB2aVIuESvjI1F9oqebuvY8lekS1pt6TN7vt7qsw==",
+      "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=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      }
+    },
+    "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.0",
+        "safe-buffer": "^5.0.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.0.0"
+      }
+    },
+    "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==",
+      "dev": true
+    },
+    "domexception": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
+      "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
+      "dev": true,
+      "requires": {
+        "webidl-conversions": "^4.0.2"
+      }
+    },
+    "domino": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.1.tgz",
+      "integrity": "sha512-fqoTi6oQ881wYRENIEmz78hKVoc3X9HqVpklo419yxzebys6dtU5c83iVh3UYvvexPFdAuwlDYCsUM9//CrMMg=="
+    },
+    "dtrace-provider": {
+      "version": "0.8.7",
+      "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz",
+      "integrity": "sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ=",
+      "optional": true,
+      "requires": {
+        "nan": "^2.10.0"
+      }
+    },
+    "duplexer3": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+    },
+    "duplexify": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
+      "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "earcut": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.1.4.tgz",
+      "integrity": "sha512-ttRjmPD5oaTtXOoxhFp9aZvMB14kBjapYaiBuzBB1elOgSLU9P2Ev86G2OClBg+uspUXERsIzXKpUWweH2K4Xg=="
+    },
+    "ecc-jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+      "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+      "optional": true,
+      "requires": {
+        "jsbn": "~0.1.0"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "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=",
+      "dev": true
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.4.0",
+        "brorand": "^1.0.1",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.0"
+      }
+    },
+    "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=",
+      "dev": true
+    },
+    "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.13"
+      }
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "enhanced-resolve": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
+      "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.4.0",
+        "object-assign": "^4.0.1",
+        "tapable": "^0.2.7"
+      }
+    },
+    "err-code": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz",
+      "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=",
+      "dev": true
+    },
+    "errno": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+      "dev": true,
+      "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=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
+      "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
+      "dev": true,
+      "requires": {
+        "es-to-primitive": "^1.2.0",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "is-callable": "^1.1.4",
+        "is-regex": "^1.0.4",
+        "object-keys": "^1.0.12"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+      "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+      "dev": true,
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
+    "es5-ext": {
+      "version": "0.10.41",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.41.tgz",
+      "integrity": "sha512-MYK02wXfwTMie5TEJWPolgOsXEmz7wKCQaGzgmRjZOoV6VLG8I5dSv2bn6AOClXhK64gnSQTQ9W9MKvx87J4gw==",
+      "dev": true,
+      "requires": {
+        "es6-iterator": "~2.0.3",
+        "es6-symbol": "~3.1.1",
+        "next-tick": "1"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "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=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14",
+        "es6-iterator": "~2.0.1",
+        "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-promisify": {
+      "version": "5.0.0",
+      "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+      "dev": true,
+      "requires": {
+        "es6-promise": "^4.0.3"
+      }
+    },
+    "es6-set": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+      "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14",
+        "es6-iterator": "~2.0.1",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "~0.3.5"
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.14",
+        "es6-iterator": "^2.0.1",
+        "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=",
+      "dev": true
+    },
+    "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==",
+      "requires": {
+        "esprima": "^3.1.3",
+        "estraverse": "^4.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1",
+        "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="
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "optional": true
+        }
+      }
+    },
+    "escope": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+      "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+      "dev": true,
+      "requires": {
+        "es6-map": "^0.1.3",
+        "es6-weak-map": "^2.0.1",
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "eslint-scope": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
+      "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^4.1.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=",
+      "dev": true
+    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
+    },
+    "eventemitter3": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
+      "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
+      "dev": true
+    },
+    "events": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
+      "dev": true
+    },
+    "eventsource": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
+      "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
+      "dev": true,
+      "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==",
+      "dev": true,
+      "requires": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "exec-sh": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz",
+      "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==",
+      "dev": true,
+      "requires": {
+        "merge": "^1.2.0"
+      }
+    },
+    "execa": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^5.0.1",
+        "get-stream": "^3.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "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=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        }
+      }
+    },
+    "executable": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
+      "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+      "dev": true,
+      "requires": {
+        "pify": "^2.2.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "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-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.0"
+      }
+    },
+    "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.1.0"
+      }
+    },
+    "expect": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-24.1.0.tgz",
+      "integrity": "sha512-lVcAPhaYkQcIyMS+F8RVwzbm1jro20IG8OkvxQ6f1JfqhVZyyudCwYogQ7wnktlf14iF3ii7ArIUO/mqvrW9Gw==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.0",
+        "jest-get-type": "^24.0.0",
+        "jest-matcher-utils": "^24.0.0",
+        "jest-message-util": "^24.0.0",
+        "jest-regex-util": "^24.0.0"
+      }
+    },
+    "express": {
+      "version": "4.16.4",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
+      "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.18.3",
+        "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.4",
+        "qs": "6.5.2",
+        "range-parser": "~1.2.0",
+        "safe-buffer": "5.1.2",
+        "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=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+      "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "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==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "external-editor": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
+      "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
+      "dev": true,
+      "requires": {
+        "chardet": "^0.7.0",
+        "iconv-lite": "^0.4.24",
+        "tmp": "^0.0.33"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "tmp": {
+          "version": "0.0.33",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+          "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+          "dev": true,
+          "requires": {
+            "os-tmpdir": "~1.0.2"
+          }
+        }
+      }
+    },
+    "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-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.2.2",
+            "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"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+    },
+    "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=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+    },
+    "fastparse": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+      "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
+      "dev": true
+    },
+    "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.5.1"
+      }
+    },
+    "fb-watchman": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz",
+      "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=",
+      "dev": true,
+      "requires": {
+        "bser": "^2.0.0"
+      }
+    },
+    "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"
+      }
+    },
+    "figgy-pudding": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
+      "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==",
+      "dev": true
+    },
+    "figures": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+      "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      }
+    },
+    "file-loader": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz",
+      "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.0.2",
+        "schema-utils": "^1.0.0"
+      }
+    },
+    "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=",
+      "requires": {
+        "glob": "^7.0.3",
+        "minimatch": "^3.0.3"
+      }
+    },
+    "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.0.0",
+        "randomatic": "^1.1.3",
+        "repeat-element": "^1.1.2",
+        "repeat-string": "^1.5.2"
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+      "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+      "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.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=",
+      "dev": true,
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^1.0.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=",
+      "dev": true,
+      "requires": {
+        "locate-path": "^2.0.0"
+      }
+    },
+    "flush-write-stream": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
+      "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.4"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.5.10",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
+      "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
+      "dev": true,
+      "requires": {
+        "debug": "=3.1.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"
+          }
+        }
+      }
+    },
+    "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=",
+      "dev": true
+    },
+    "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.1"
+      }
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+    },
+    "form-data": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+      "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.5",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "dev": true
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "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=",
+      "dev": true
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "fs": {
+      "version": "0.0.1-security",
+      "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
+      "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=",
+      "dev": true
+    },
+    "fs-extra": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
+      "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      }
+    },
+    "fs-minipass": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
+      "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
+      "dev": true,
+      "requires": {
+        "minipass": "^2.2.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=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "iferr": "^0.1.5",
+        "imurmurhash": "^0.1.4",
+        "readable-stream": "1 || 2"
+      }
+    },
+    "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==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nan": "^2.3.0",
+        "node-pre-gyp": "^0.6.39"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ajv": {
+          "version": "4.11.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "co": "^4.6.0",
+            "json-stable-stringify": "^1.0.1"
+          }
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true,
+          "dev": true
+        },
+        "aproba": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.6"
+          }
+        },
+        "asn1": {
+          "version": "0.2.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "assert-plus": {
+          "version": "0.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "asynckit": {
+          "version": "0.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "aws-sign2": {
+          "version": "0.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "aws4": {
+          "version": "1.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "balanced-match": {
+          "version": "0.4.2",
+          "bundled": true,
+          "dev": true
+        },
+        "bcrypt-pbkdf": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "tweetnacl": "^0.14.3"
+          }
+        },
+        "block-stream": {
+          "version": "0.0.9",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "inherits": "~2.0.0"
+          }
+        },
+        "boom": {
+          "version": "2.10.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "hoek": "2.x.x"
+          }
+        },
+        "brace-expansion": {
+          "version": "1.1.7",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "balanced-match": "^0.4.1",
+            "concat-map": "0.0.1"
+          }
+        },
+        "buffer-shims": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "caseless": {
+          "version": "0.12.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "co": {
+          "version": "4.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "combined-stream": {
+          "version": "1.0.5",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "delayed-stream": "~1.0.0"
+          }
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "cryptiles": {
+          "version": "2.0.5",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "boom": "2.x.x"
+          }
+        },
+        "dashdash": {
+          "version": "1.14.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "^1.0.0"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "debug": {
+          "version": "2.6.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.4.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "delayed-stream": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "detect-libc": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ecc-jsbn": {
+          "version": "0.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "jsbn": "~0.1.0"
+          }
+        },
+        "extend": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "extsprintf": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "forever-agent": {
+          "version": "0.6.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "form-data": {
+          "version": "2.1.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.5",
+            "mime-types": "^2.1.12"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "fstream": {
+          "version": "1.0.11",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "inherits": "~2.0.0",
+            "mkdirp": ">=0.5 0",
+            "rimraf": "2"
+          }
+        },
+        "fstream-ignore": {
+          "version": "1.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fstream": "^1.0.0",
+            "inherits": "2",
+            "minimatch": "^3.0.0"
+          }
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aproba": "^1.0.3",
+            "console-control-strings": "^1.0.0",
+            "has-unicode": "^2.0.0",
+            "object-assign": "^4.1.0",
+            "signal-exit": "^3.0.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wide-align": "^1.1.0"
+          }
+        },
+        "getpass": {
+          "version": "0.1.7",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "^1.0.0"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "glob": {
+          "version": "7.1.2",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "graceful-fs": {
+          "version": "4.1.11",
+          "bundled": true,
+          "dev": true
+        },
+        "har-schema": {
+          "version": "1.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "har-validator": {
+          "version": "4.2.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ajv": "^4.9.1",
+            "har-schema": "^1.0.5"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "hawk": {
+          "version": "3.1.3",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "boom": "2.x.x",
+            "cryptiles": "2.x.x",
+            "hoek": "2.x.x",
+            "sntp": "1.x.x"
+          }
+        },
+        "hoek": {
+          "version": "2.16.3",
+          "bundled": true,
+          "dev": true
+        },
+        "http-signature": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "^0.2.0",
+            "jsprim": "^1.2.2",
+            "sshpk": "^1.7.0"
+          }
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "once": "^1.3.0",
+            "wrappy": "1"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true,
+          "dev": true
+        },
+        "ini": {
+          "version": "1.3.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "is-typedarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "isstream": {
+          "version": "0.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "jodid25519": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "jsbn": "~0.1.0"
+          }
+        },
+        "jsbn": {
+          "version": "0.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "json-schema": {
+          "version": "0.2.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "json-stable-stringify": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "jsonify": "~0.0.0"
+          }
+        },
+        "json-stringify-safe": {
+          "version": "5.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "jsonify": {
+          "version": "0.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "jsprim": {
+          "version": "1.4.0",
+          "bundled": true,
+          "dev": 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,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "mime-db": {
+          "version": "1.27.0",
+          "bundled": true,
+          "dev": true
+        },
+        "mime-types": {
+          "version": "2.1.15",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "mime-db": "~1.27.0"
+          }
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true,
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "node-pre-gyp": {
+          "version": "0.6.39",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "detect-libc": "^1.0.2",
+            "hawk": "3.1.3",
+            "mkdirp": "^0.5.1",
+            "nopt": "^4.0.1",
+            "npmlog": "^4.0.2",
+            "rc": "^1.1.7",
+            "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,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1",
+            "osenv": "^0.1.4"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.3",
+            "set-blocking": "~2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "oauth-sign": {
+          "version": "0.8.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "wrappy": "1"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "osenv": {
+          "version": "0.1.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "os-homedir": "^1.0.0",
+            "os-tmpdir": "^1.0.0"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "performance-now": {
+          "version": "0.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "process-nextick-args": {
+          "version": "1.0.7",
+          "bundled": true,
+          "dev": true
+        },
+        "punycode": {
+          "version": "1.4.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "qs": {
+          "version": "6.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "rc": {
+          "version": "1.2.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "deep-extend": "~0.4.0",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "1.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.2.9",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "buffer-shims": "~1.0.0",
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.1",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~1.0.6",
+            "string_decoder": "~1.0.0",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "request": {
+          "version": "2.81.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aws-sign2": "~0.6.0",
+            "aws4": "^1.2.1",
+            "caseless": "~0.12.0",
+            "combined-stream": "~1.0.5",
+            "extend": "~3.0.0",
+            "forever-agent": "~0.6.1",
+            "form-data": "~2.1.1",
+            "har-validator": "~4.2.1",
+            "hawk": "~3.1.3",
+            "http-signature": "~1.1.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.7",
+            "oauth-sign": "~0.8.1",
+            "performance-now": "^0.2.0",
+            "qs": "~6.4.0",
+            "safe-buffer": "^5.0.1",
+            "stringstream": "~0.0.4",
+            "tough-cookie": "~2.3.0",
+            "tunnel-agent": "^0.6.0",
+            "uuid": "^3.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "glob": "^7.0.5"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "semver": {
+          "version": "5.3.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "sntp": {
+          "version": "1.0.9",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "hoek": "2.x.x"
+          }
+        },
+        "sshpk": {
+          "version": "1.13.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asn1": "~0.2.3",
+            "assert-plus": "^1.0.0",
+            "bcrypt-pbkdf": "^1.0.0",
+            "dashdash": "^1.12.0",
+            "ecc-jsbn": "~0.1.1",
+            "getpass": "^0.1.1",
+            "jodid25519": "^1.0.0",
+            "jsbn": "~0.1.0",
+            "tweetnacl": "~0.14.0"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "string_decoder": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "safe-buffer": "^5.0.1"
+          }
+        },
+        "stringstream": {
+          "version": "0.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "2.2.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "block-stream": "*",
+            "fstream": "^1.0.2",
+            "inherits": "2"
+          }
+        },
+        "tar-pack": {
+          "version": "3.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "debug": "^2.2.0",
+            "fstream": "^1.0.10",
+            "fstream-ignore": "^1.0.5",
+            "once": "^1.3.3",
+            "readable-stream": "^2.1.4",
+            "rimraf": "^2.5.1",
+            "tar": "^2.2.1",
+            "uid-number": "^0.0.6"
+          }
+        },
+        "tough-cookie": {
+          "version": "2.3.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "punycode": "^1.4.1"
+          }
+        },
+        "tunnel-agent": {
+          "version": "0.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "^5.0.1"
+          }
+        },
+        "tweetnacl": {
+          "version": "0.14.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "uid-number": {
+          "version": "0.0.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "uuid": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "verror": {
+          "version": "1.3.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "extsprintf": "1.0.2"
+          }
+        },
+        "wide-align": {
+          "version": "1.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "string-width": "^1.0.2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": 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.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.0.3",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.0",
+        "object-assign": "^4.1.0",
+        "signal-exit": "^3.0.0",
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wide-align": "^1.1.0"
+      }
+    },
+    "gaze": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "globule": "^1.0.0"
+      }
+    },
+    "genfun": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz",
+      "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==",
+      "dev": true
+    },
+    "geojson-equality": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/geojson-equality/-/geojson-equality-0.1.6.tgz",
+      "integrity": "sha1-oXE3TvBD5dR5eZWEC65GSOB1LXI=",
+      "requires": {
+        "deep-equal": "^1.0.0"
+      }
+    },
+    "geojson-rbush": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/geojson-rbush/-/geojson-rbush-2.1.0.tgz",
+      "integrity": "sha1-O9c745H8ELCuaT2bis6iquC4Oo0=",
+      "requires": {
+        "@turf/helpers": "*",
+        "@turf/meta": "*",
+        "rbush": "*"
+      }
+    },
+    "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=",
+      "dev": true
+    },
+    "get-closest": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/get-closest/-/get-closest-0.0.4.tgz",
+      "integrity": "sha1-JprHdtHmAiqg/Vht1wjop9Miaa8="
+    },
+    "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-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "getos": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.0.tgz",
+      "integrity": "sha512-i9vrxtDu5DlLVFcrbqUqGWYlZN/zZ4pGMICCAcZoYsX3JA54nYp8r5EThw5K+m2q3wszkx4Th746JstspB0H4Q==",
+      "dev": true,
+      "requires": {
+        "async": "2.4.0"
+      },
+      "dependencies": {
+        "async": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/async/-/async-2.4.0.tgz",
+          "integrity": "sha1-SZAgDxjqW4N8LMT4wDGmmFw4VhE=",
+          "dev": true,
+          "requires": {
+            "lodash": "^4.14.0"
+          }
+        }
+      }
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "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="
+        }
+      }
+    },
+    "gitignore-parser": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/gitignore-parser/-/gitignore-parser-0.0.2.tgz",
+      "integrity": "sha1-9hJZuYXdkUFLmnFo+u+RccLuxd8="
+    },
+    "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.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "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.0"
+      }
+    },
+    "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.0"
+      }
+    },
+    "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.4"
+      }
+    },
+    "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.1",
+        "dir-glob": "^2.0.0",
+        "glob": "^7.1.2",
+        "ignore": "^3.3.5",
+        "pify": "^3.0.0",
+        "slash": "^1.0.0"
+      }
+    },
+    "globule": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
+      "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "glob": "~7.1.1",
+        "lodash": "~4.17.10",
+        "minimatch": "~3.0.2"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "got": {
+      "version": "6.7.1",
+      "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz",
+      "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+      "requires": {
+        "create-error-class": "^3.0.0",
+        "duplexer3": "^0.1.4",
+        "get-stream": "^3.0.0",
+        "is-redirect": "^1.0.0",
+        "is-retry-allowed": "^1.0.0",
+        "is-stream": "^1.0.0",
+        "lowercase-keys": "^1.0.0",
+        "safe-buffer": "^5.0.1",
+        "timed-out": "^4.0.0",
+        "unzip-response": "^2.0.1",
+        "url-parse-lax": "^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="
+    },
+    "growly": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
+      "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
+      "dev": true
+    },
+    "hammerjs": {
+      "version": "2.0.8",
+      "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz",
+      "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=",
+      "dev": true
+    },
+    "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.4.0",
+        "optimist": "^0.6.1",
+        "source-map": "^0.4.4",
+        "uglify-js": "^2.6"
+      },
+      "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.1",
+            "right-align": "^0.1.1",
+            "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": ">=0.0.4"
+          }
+        },
+        "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.1",
+            "uglify-to-browserify": "~1.0.0",
+            "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.0.2",
+            "cliui": "^2.1.0",
+            "decamelize": "^1.0.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="
+    },
+    "har-validator": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+      "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+      "requires": {
+        "ajv": "^4.9.1",
+        "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=",
+          "requires": {
+            "co": "^4.6.0",
+            "json-stable-stringify": "^1.0.1"
+          }
+        }
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "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.0.0"
+      }
+    },
+    "has-flag": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+      "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
+    },
+    "has-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+      "dev": true
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
+      }
+    },
+    "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=",
+      "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.5"
+          }
+        }
+      }
+    },
+    "hash-base": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
+      "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1"
+      }
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "hawk": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+      "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+      "requires": {
+        "boom": "2.x.x",
+        "cryptiles": "2.x.x",
+        "hoek": "2.x.x",
+        "sntp": "1.x.x"
+      }
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "requires": {
+        "hash.js": "^1.0.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="
+    },
+    "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.0",
+        "os-tmpdir": "^1.0.1"
+      }
+    },
+    "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==",
+      "dev": true
+    },
+    "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.1",
+        "obuf": "^1.0.0",
+        "readable-stream": "^2.0.1",
+        "wbuf": "^1.1.0"
+      }
+    },
+    "html-encoding-sniffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
+      "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
+      "dev": true,
+      "requires": {
+        "whatwg-encoding": "^1.0.1"
+      }
+    },
+    "html-entities": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
+      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
+      "dev": true
+    },
+    "http-cache-semantics": {
+      "version": "3.8.1",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
+      "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
+      "dev": true
+    },
+    "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.3",
+      "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+      "dev": true,
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.0",
+        "statuses": ">= 1.4.0 < 2"
+      }
+    },
+    "http-parser-js": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
+      "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==",
+      "dev": true
+    },
+    "http-proxy": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
+      "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "^3.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "http-proxy-agent": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
+      "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
+      "dev": true,
+      "requires": {
+        "agent-base": "4",
+        "debug": "3.1.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"
+          }
+        }
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "0.18.0",
+      "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz",
+      "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==",
+      "dev": true,
+      "requires": {
+        "http-proxy": "^1.16.2",
+        "is-glob": "^4.0.0",
+        "lodash": "^4.17.5",
+        "micromatch": "^3.1.9"
+      },
+      "dependencies": {
+        "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.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.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.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.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "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.0"
+              }
+            },
+            "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.0.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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "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.0"
+              }
+            }
+          }
+        },
+        "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.0"
+          },
+          "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.0"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.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.5"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.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.5"
+              }
+            }
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        }
+      }
+    },
+    "http-signature": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+      "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+      "requires": {
+        "assert-plus": "^0.2.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
+    "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=",
+      "dev": true
+    },
+    "https-proxy-agent": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
+      "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
+      "dev": true,
+      "requires": {
+        "agent-base": "^4.1.0",
+        "debug": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "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==",
+          "dev": true
+        }
+      }
+    },
+    "humanize-ms": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+      "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
+      "dev": true,
+      "requires": {
+        "ms": "^2.0.0"
+      }
+    },
+    "husky": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz",
+      "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.7",
+        "execa": "^1.0.0",
+        "find-up": "^3.0.0",
+        "get-stdin": "^6.0.0",
+        "is-ci": "^2.0.0",
+        "pkg-dir": "^3.0.0",
+        "please-upgrade-node": "^3.1.1",
+        "read-pkg": "^4.0.1",
+        "run-node": "^1.0.0",
+        "slash": "^2.0.0"
+      },
+      "dependencies": {
+        "ci-info": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+          "dev": true
+        },
+        "cosmiconfig": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz",
+          "integrity": "sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==",
+          "dev": true,
+          "requires": {
+            "import-fresh": "^2.0.0",
+            "is-directory": "^0.3.1",
+            "js-yaml": "^3.9.0",
+            "lodash.get": "^4.4.2",
+            "parse-json": "^4.0.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^4.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "get-stdin": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+          "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+          "dev": true
+        },
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "is-ci": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+          "dev": true,
+          "requires": {
+            "ci-info": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz",
+          "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+          "dev": true
+        },
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+          "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "read-pkg": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz",
+          "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=",
+          "dev": true,
+          "requires": {
+            "normalize-package-data": "^2.3.2",
+            "parse-json": "^4.0.0",
+            "pify": "^3.0.0"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        }
+      }
+    },
+    "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=="
+    },
+    "ieee754": {
+      "version": "1.1.10",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.10.tgz",
+      "integrity": "sha512-byWFX8OyW/qeVxcY21r6Ncxl0ZYHgnf0cPup2h34eHXrCJbOp7IuqnJ4Q0omfyWl6Z++BTI6bByf31pZt7iRLg==",
+      "dev": true
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "dev": true
+    },
+    "ignore": {
+      "version": "3.3.10",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+      "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+      "dev": true
+    },
+    "ignore-walk": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
+      "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
+      "dev": true,
+      "requires": {
+        "minimatch": "^3.0.4"
+      }
+    },
+    "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
+    },
+    "import-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
+      "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
+      "dev": true,
+      "requires": {
+        "import-from": "^2.1.0"
+      }
+    },
+    "import-fresh": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+      "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+      "dev": true,
+      "requires": {
+        "caller-path": "^2.0.0",
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-from": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
+      "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-local": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
+      "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^3.0.0",
+        "resolve-cwd": "^2.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
+          "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+          "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        }
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
+    },
+    "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.0"
+      }
+    },
+    "indexof": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "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=="
+    },
+    "inquirer": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz",
+      "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^3.0.0",
+        "chalk": "^2.0.0",
+        "cli-cursor": "^2.1.0",
+        "cli-width": "^2.0.0",
+        "external-editor": "^3.0.0",
+        "figures": "^2.0.0",
+        "lodash": "^4.17.10",
+        "mute-stream": "0.0.7",
+        "run-async": "^2.2.0",
+        "rxjs": "^6.1.0",
+        "string-width": "^2.1.0",
+        "strip-ansi": "^4.0.0",
+        "through": "^2.3.6"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "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
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "install": {
+      "version": "0.12.2",
+      "resolved": "https://registry.npmjs.org/install/-/install-0.12.2.tgz",
+      "integrity": "sha512-+7thTb4Rpvs9mnlhHKGZFJbGOO6kyMgy+gg0sgM5vFzIFK0wrCYXqdlaM71Bi289DTuPHf61puMFsaZBcwDIrg=="
+    },
+    "internal-ip": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz",
+      "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==",
+      "dev": true,
+      "requires": {
+        "default-gateway": "^2.6.0",
+        "ipaddr.js": "^1.5.2"
+      }
+    },
+    "interpret": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+      "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+      "dev": true
+    },
+    "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.0.0"
+      }
+    },
+    "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=",
+      "dev": true
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
+    },
+    "ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
+      "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
+      "dev": true
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.0"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "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=",
+      "dev": true,
+      "requires": {
+        "binary-extensions": "^1.0.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=",
+      "dev": true,
+      "requires": {
+        "builtin-modules": "^1.0.0"
+      }
+    },
+    "is-callable": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+      "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+      "dev": true
+    },
+    "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.0.0"
+      }
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.0"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "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=",
+      "dev": true
+    },
+    "is-descriptor": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+      "dev": true,
+      "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==",
+          "dev": true
+        }
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+      "dev": true
+    },
+    "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": {
-        "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"
+        "is-primitive": "^2.0.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=",
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+    },
+    "is-finite": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
+        "number-is-nan": "^1.0.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=",
+    "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=",
+      "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "number-is-nan": "^1.0.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=",
+    "is-generator-fn": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.0.0.tgz",
+      "integrity": "sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g==",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "is-extglob": "^1.0.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=",
+    "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": {
-        "babel-runtime": "6.26.0"
+        "global-dirs": "^0.1.0",
+        "is-path-inside": "^1.0.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=",
+    "is-invalid-path": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz",
+      "integrity": "sha1-MHqFWzzxqTi0TqcNLGEQYFNxTzQ=",
       "requires": {
-        "babel-helper-function-name": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "is-glob": "^2.0.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=",
+    "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": {
-        "babel-runtime": "6.26.0"
+        "kind-of": "^3.0.2"
       }
     },
-    "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=",
+    "is-odd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+      "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+      "dev": true,
       "requires": {
-        "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
+        "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==",
+          "dev": true
+        }
       }
     },
-    "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=",
+    "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.1",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+      "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+      "dev": true,
       "requires": {
-        "babel-plugin-transform-strict-mode": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0",
-        "babel-types": "6.26.0"
+        "is-path-inside": "^1.0.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=",
+    "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.1"
+      }
+    },
+    "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==",
+      "dev": true,
+      "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=",
+          "dev": true
+        }
+      }
+    },
+    "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=",
+      "dev": true
+    },
+    "is-redirect": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+      "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
+    },
+    "is-regex": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.1"
+      }
+    },
+    "is-retry-allowed": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+      "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+    },
+    "is-symbol": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+      "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.0"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+    },
+    "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-valid-path": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz",
+      "integrity": "sha1-EQ+f90w39mPh7HkV60UfLbk6yd8=",
+      "requires": {
+        "is-invalid-path": "^0.1.0"
+      }
+    },
+    "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==",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+    },
+    "istanbul": {
+      "version": "0.4.5",
+      "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
+      "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
+      "dev": true,
       "requires": {
-        "babel-helper-hoist-variables": "6.24.1",
-        "babel-runtime": "6.26.0",
-        "babel-template": "6.26.0"
+        "abbrev": "1.0.x",
+        "async": "1.x",
+        "escodegen": "1.8.x",
+        "esprima": "2.7.x",
+        "glob": "^5.0.15",
+        "handlebars": "^4.0.1",
+        "js-yaml": "3.x",
+        "mkdirp": "0.5.x",
+        "nopt": "3.x",
+        "once": "1.x",
+        "resolve": "1.1.x",
+        "supports-color": "^3.1.0",
+        "which": "^1.1.1",
+        "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.1",
+            "estraverse": "^1.9.1",
+            "esutils": "^2.0.2",
+            "optionator": "^0.8.1",
+            "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.4",
+            "inherits": "2",
+            "minimatch": "2 || 3",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "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"
+          }
+        },
+        "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": ">=0.0.4"
+          }
+        },
+        "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
+        }
       }
     },
-    "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"
+    "istanbul-api": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.1.tgz",
+      "integrity": "sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw==",
+      "dev": true,
+      "requires": {
+        "async": "^2.6.1",
+        "compare-versions": "^3.2.1",
+        "fileset": "^2.0.3",
+        "istanbul-lib-coverage": "^2.0.3",
+        "istanbul-lib-hook": "^2.0.3",
+        "istanbul-lib-instrument": "^3.1.0",
+        "istanbul-lib-report": "^2.0.4",
+        "istanbul-lib-source-maps": "^3.0.2",
+        "istanbul-reports": "^2.1.1",
+        "js-yaml": "^3.12.0",
+        "make-dir": "^1.3.0",
+        "minimatch": "^3.0.4",
+        "once": "^1.4.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.3.tgz",
+          "integrity": "sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.3.3",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.11",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.3.tgz",
+          "integrity": "sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+          "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.2.2",
+            "@babel/helper-function-name": "^7.1.0",
+            "@babel/helper-split-export-declaration": "^7.0.0",
+            "@babel/parser": "^7.2.3",
+            "@babel/types": "^7.2.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.10"
+          }
+        },
+        "@babel/types": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.3.tgz",
+          "integrity": "sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.11",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "async": {
+          "version": "2.6.2",
+          "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
+          "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
+          "dev": true,
+          "requires": {
+            "lodash": "^4.17.11"
+          }
+        },
+        "commander": {
+          "version": "2.17.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+          "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+          "dev": true,
+          "optional": true
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "globals": {
+          "version": "11.11.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz",
+          "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==",
+          "dev": true
+        },
+        "handlebars": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz",
+          "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==",
+          "dev": true,
+          "requires": {
+            "async": "^2.5.0",
+            "optimist": "^0.6.1",
+            "source-map": "^0.6.1",
+            "uglify-js": "^3.1.4"
+          },
+          "dependencies": {
+            "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
+            }
+          }
+        },
+        "istanbul-lib-coverage": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+          "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==",
+          "dev": true
+        },
+        "istanbul-lib-instrument": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz",
+          "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==",
+          "dev": true,
+          "requires": {
+            "@babel/generator": "^7.0.0",
+            "@babel/parser": "^7.0.0",
+            "@babel/template": "^7.0.0",
+            "@babel/traverse": "^7.0.0",
+            "@babel/types": "^7.0.0",
+            "istanbul-lib-coverage": "^2.0.3",
+            "semver": "^5.5.0"
+          }
+        },
+        "istanbul-reports": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.1.1.tgz",
+          "integrity": "sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw==",
+          "dev": true,
+          "requires": {
+            "handlebars": "^4.1.0"
+          }
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "js-yaml": {
+          "version": "3.12.1",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz",
+          "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==",
+          "dev": true,
+          "requires": {
+            "argparse": "^1.0.7",
+            "esprima": "^4.0.0"
+          }
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "make-dir": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+          "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          }
+        },
+        "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==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        },
+        "uglify-js": {
+          "version": "3.4.9",
+          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
+          "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "commander": "~2.17.1",
+            "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==",
+              "dev": true,
+              "optional": true
+            }
+          }
+        }
       }
     },
-    "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=",
+    "istanbul-instrumenter-loader": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz",
+      "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==",
+      "dev": true,
       "requires": {
-        "babel-helper-replace-supers": "6.24.1",
-        "babel-runtime": "6.26.0"
+        "convert-source-map": "^1.5.0",
+        "istanbul-lib-instrument": "^1.7.3",
+        "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.0.0",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.3.0"
+          }
+        },
+        "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.0.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"
-      }
+    "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=="
     },
-    "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=",
+    "istanbul-lib-hook": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz",
+      "integrity": "sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA==",
+      "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "append-transform": "^1.0.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=",
+    "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==",
       "requires": {
-        "babel-runtime": "6.26.0"
+        "babel-generator": "^6.18.0",
+        "babel-template": "^6.16.0",
+        "babel-traverse": "^6.18.0",
+        "babel-types": "^6.18.0",
+        "babylon": "^6.18.0",
+        "istanbul-lib-coverage": "^1.2.0",
+        "semver": "^5.3.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=",
+    "istanbul-lib-report": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz",
+      "integrity": "sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==",
+      "dev": true,
       "requires": {
-        "babel-helper-regex": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0"
+        "istanbul-lib-coverage": "^2.0.3",
+        "make-dir": "^1.3.0",
+        "supports-color": "^6.0.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "istanbul-lib-coverage": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+          "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==",
+          "dev": true
+        },
+        "make-dir": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+          "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.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=",
+    "istanbul-lib-source-maps": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz",
+      "integrity": "sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==",
+      "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "debug": "^4.1.1",
+        "istanbul-lib-coverage": "^2.0.3",
+        "make-dir": "^1.3.0",
+        "rimraf": "^2.6.2",
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "istanbul-lib-coverage": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+          "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==",
+          "dev": true
+        },
+        "make-dir": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+          "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          }
+        },
+        "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==",
+          "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
+        }
       }
     },
-    "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=",
+    "istanbul-reports": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz",
+      "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==",
+      "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0"
+        "handlebars": "^4.0.11"
       }
     },
-    "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=",
+    "jest": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-24.1.0.tgz",
+      "integrity": "sha512-+q91L65kypqklvlRFfXfdzUKyngQLOcwGhXQaLmVHv+d09LkNXuBuGxlofTFW42XMzu3giIcChchTsCNUjQ78A==",
+      "dev": true,
       "requires": {
-        "babel-helper-regex": "6.26.0",
-        "babel-runtime": "6.26.0",
-        "regexpu-core": "2.0.0"
+        "import-local": "^2.0.0",
+        "jest-cli": "^24.1.0"
       },
       "dependencies": {
-        "regexpu-core": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.3.tgz",
+          "integrity": "sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.3.3",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.11",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.3.tgz",
+          "integrity": "sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+          "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.2.2",
+            "@babel/helper-function-name": "^7.1.0",
+            "@babel/helper-split-export-declaration": "^7.0.0",
+            "@babel/parser": "^7.2.3",
+            "@babel/types": "^7.2.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.10"
+          }
+        },
+        "@babel/types": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.3.tgz",
+          "integrity": "sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.11",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "ansi-regex": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz",
+          "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==",
+          "dev": true
+        },
+        "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.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.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.0"
+              }
+            }
+          }
+        },
+        "camelcase": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
+          "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
+          "dev": true
+        },
+        "ci-info": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+          "dev": true
+        },
+        "cliui": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+          "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^2.1.1",
+            "strip-ansi": "^4.0.0",
+            "wrap-ansi": "^2.0.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "3.0.0",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+              "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+              "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"
+              }
+            }
+          }
+        },
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "execa": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^4.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.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.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "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.0"
+              }
+            },
+            "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.0"
+              }
+            },
+            "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.0.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
+            },
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+              "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "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.0"
+              }
+            }
+          }
+        },
+        "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.0"
+          },
+          "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.0"
+              }
+            }
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "globals": {
+          "version": "11.11.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz",
+          "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==",
+          "dev": true
+        },
+        "graceful-fs": {
+          "version": "4.1.15",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+          "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+          "dev": true
+        },
+        "invert-kv": {
           "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
-          "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+          "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
+          "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
+          "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": {
-            "regenerate": "1.3.3",
-            "regjsgen": "0.2.0",
-            "regjsparser": "0.1.5"
+            "kind-of": "^3.0.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.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"
+        },
+        "is-ci": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+          "dev": true,
+          "requires": {
+            "ci-info": "^2.0.0"
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "istanbul-lib-coverage": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+          "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==",
+          "dev": true
+        },
+        "istanbul-lib-instrument": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz",
+          "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==",
+          "dev": true,
+          "requires": {
+            "@babel/generator": "^7.0.0",
+            "@babel/parser": "^7.0.0",
+            "@babel/template": "^7.0.0",
+            "@babel/traverse": "^7.0.0",
+            "@babel/types": "^7.0.0",
+            "istanbul-lib-coverage": "^2.0.3",
+            "semver": "^5.5.0"
+          }
+        },
+        "jest-cli": {
+          "version": "24.1.0",
+          "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.1.0.tgz",
+          "integrity": "sha512-U/iyWPwOI0T1CIxVLtk/2uviOTJ/OiSWJSe8qt6X1VkbbgP+nrtLJlmT9lPBe4lK78VNFJtrJ7pttcNv/s7yCw==",
+          "dev": true,
+          "requires": {
+            "ansi-escapes": "^3.0.0",
+            "chalk": "^2.0.1",
+            "exit": "^0.1.2",
+            "glob": "^7.1.2",
+            "graceful-fs": "^4.1.15",
+            "import-local": "^2.0.0",
+            "is-ci": "^2.0.0",
+            "istanbul-api": "^2.0.8",
+            "istanbul-lib-coverage": "^2.0.2",
+            "istanbul-lib-instrument": "^3.0.1",
+            "istanbul-lib-source-maps": "^3.0.1",
+            "jest-changed-files": "^24.0.0",
+            "jest-config": "^24.1.0",
+            "jest-environment-jsdom": "^24.0.0",
+            "jest-get-type": "^24.0.0",
+            "jest-haste-map": "^24.0.0",
+            "jest-message-util": "^24.0.0",
+            "jest-regex-util": "^24.0.0",
+            "jest-resolve-dependencies": "^24.1.0",
+            "jest-runner": "^24.1.0",
+            "jest-runtime": "^24.1.0",
+            "jest-snapshot": "^24.1.0",
+            "jest-util": "^24.0.0",
+            "jest-validate": "^24.0.0",
+            "jest-watcher": "^24.0.0",
+            "jest-worker": "^24.0.0",
+            "micromatch": "^3.1.10",
+            "node-notifier": "^5.2.1",
+            "p-each-series": "^1.0.0",
+            "pirates": "^4.0.0",
+            "prompts": "^2.0.1",
+            "realpath-native": "^1.0.0",
+            "rimraf": "^2.5.4",
+            "slash": "^2.0.0",
+            "string-length": "^2.0.0",
+            "strip-ansi": "^5.0.0",
+            "which": "^1.2.12",
+            "yargs": "^12.0.2"
+          }
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "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
+        },
+        "lcid": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+          "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+          "dev": true,
+          "requires": {
+            "invert-kv": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "mem": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz",
+          "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==",
+          "dev": true,
+          "requires": {
+            "map-age-cleaner": "^0.1.1",
+            "mimic-fn": "^1.0.0",
+            "p-is-promise": "^2.0.0"
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "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==",
+          "dev": true
+        },
+        "os-locale": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
+          "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+          "dev": true,
+          "requires": {
+            "execa": "^1.0.0",
+            "lcid": "^2.0.0",
+            "mem": "^4.0.0"
+          }
+        },
+        "p-is-promise": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz",
+          "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==",
+          "dev": true
+        },
+        "p-limit": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz",
+          "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+          "dev": true
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        },
+        "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": {
+            "ansi-regex": {
+              "version": "3.0.0",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+              "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+              "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-ansi": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz",
+          "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.0.0"
+          }
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        },
+        "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
+        },
+        "yargs": {
+          "version": "12.0.5",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
+          "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^4.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^3.0.0",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^2.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^3.2.1 || ^4.0.0",
+            "yargs-parser": "^11.1.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "11.1.1",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
+          "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
       }
     },
-    "babel-register": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
-      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+    "jest-changed-files": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.0.0.tgz",
+      "integrity": "sha512-nnuU510R9U+UX0WNb5XFEcsrMqriSiRLeO9KWDFgPrpToaQm60prfQYpxsXigdClpvNot5bekDY440x9dNGnsQ==",
       "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"
+        "execa": "^1.0.0",
+        "throat": "^4.0.0"
       },
       "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
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^4.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
         }
       }
     },
-    "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"
+    "jest-config": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.1.0.tgz",
+      "integrity": "sha512-FbbRzRqtFC6eGjG5VwsbW4E5dW3zqJKLWYiZWhB0/4E5fgsMw8GODLbGSrY5t17kKOtCWb/Z7nsIThRoDpuVyg==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.1.0",
+        "babel-jest": "^24.1.0",
+        "chalk": "^2.0.1",
+        "glob": "^7.1.1",
+        "jest-environment-jsdom": "^24.0.0",
+        "jest-environment-node": "^24.0.0",
+        "jest-get-type": "^24.0.0",
+        "jest-jasmine2": "^24.1.0",
+        "jest-regex-util": "^24.0.0",
+        "jest-resolve": "^24.1.0",
+        "jest-util": "^24.0.0",
+        "jest-validate": "^24.0.0",
+        "micromatch": "^3.1.10",
+        "pretty-format": "^24.0.0",
+        "realpath-native": "^1.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=",
+        "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.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.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.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.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "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.0"
+              }
+            },
+            "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.0.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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "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.0"
+              }
+            }
+          }
+        },
+        "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.0"
+          },
+          "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.0"
+              }
+            }
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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": {
-            "is-descriptor": "1.0.2"
+            "kind-of": "^3.0.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.5"
+              }
+            }
           }
         },
         "isobject": {
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+          "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.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
         }
       }
     },
-    "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=",
+    "jest-diff": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.0.0.tgz",
+      "integrity": "sha512-XY5wMpRaTsuMoU+1/B2zQSKQ9RdE9gsLkGydx3nvApeyPijLA8GtEvIcPwISRCer+VDf9W1mStTYYq6fPt8ryA==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "tweetnacl": "0.14.5"
+        "chalk": "^2.0.1",
+        "diff-sequences": "^24.0.0",
+        "jest-get-type": "^24.0.0",
+        "pretty-format": "^24.0.0"
       }
     },
-    "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=",
+    "jest-docblock": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.0.0.tgz",
+      "integrity": "sha512-KfAKZ4SN7CFOZpWg4i7g7MSlY0M+mq7K0aMqENaG2vHuhC9fc3vkpU/iNN9sOus7v3h3Y48uEjqz3+Gdn2iptA==",
       "dev": true,
       "requires": {
-        "callsite": "1.0.0"
+        "detect-newline": "^2.1.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=="
+    "jest-each": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.0.0.tgz",
+      "integrity": "sha512-gFcbY4Cu55yxExXMkjrnLXov3bWO3dbPAW7HXb31h/DNWdNc/6X8MtxGff8nh3/MjkF9DpVqnj0KsPKuPK0cpA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.1",
+        "jest-get-type": "^24.0.0",
+        "jest-util": "^24.0.0",
+        "pretty-format": "^24.0.0"
+      }
     },
-    "binary-extensions": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
-      "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU="
+    "jest-environment-jsdom": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.0.0.tgz",
+      "integrity": "sha512-1YNp7xtxajTRaxbylDc2pWvFnfDTH5BJJGyVzyGAKNt/lEULohwEV9zFqTgG4bXRcq7xzdd+sGFws+LxThXXOw==",
+      "dev": true,
+      "requires": {
+        "jest-mock": "^24.0.0",
+        "jest-util": "^24.0.0",
+        "jsdom": "^11.5.1"
+      }
     },
-    "bitsyntax": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz",
-      "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=",
+    "jest-environment-node": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.0.0.tgz",
+      "integrity": "sha512-62fOFcaEdU0VLaq8JL90TqwI7hLn0cOKOl8vY2n477vRkCJRojiRRtJVRzzCcgFvs6gqU97DNqX5R0BrBP6Rxg==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "buffer-more-ints": "0.0.2"
+        "jest-mock": "^24.0.0",
+        "jest-util": "^24.0.0"
       }
     },
-    "bl": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz",
-      "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=",
+    "jest-get-type": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.0.0.tgz",
+      "integrity": "sha512-z6/Eyf6s9ZDGz7eOvl+fzpuJmN9i0KyTt1no37/dHu8galssxz5ZEgnc1KaV8R31q1khxyhB4ui/X5ZjjPk77w==",
+      "dev": true
+    },
+    "jest-haste-map": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.0.0.tgz",
+      "integrity": "sha512-CcViJyUo41IQqttLxXVdI41YErkzBKbE6cS6dRAploCeutePYfUimWd3C9rQEWhX0YBOQzvNsC0O9nYxK2nnxQ==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "readable-stream": "2.0.6"
+        "fb-watchman": "^2.0.0",
+        "graceful-fs": "^4.1.15",
+        "invariant": "^2.2.4",
+        "jest-serializer": "^24.0.0",
+        "jest-util": "^24.0.0",
+        "jest-worker": "^24.0.0",
+        "micromatch": "^3.1.10",
+        "sane": "^3.0.0"
       },
       "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=",
+        "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.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
           "dev": true,
-          "optional": true
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.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.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.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "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.0"
+              }
+            },
+            "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.0.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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "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.0"
+              }
+            }
+          }
+        },
+        "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.0"
+          },
+          "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.0"
+              }
+            }
+          }
+        },
+        "graceful-fs": {
+          "version": "4.1.15",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+          "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+          "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
         },
-        "readable-stream": {
-          "version": "2.0.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
-          "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
           "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"
+            "kind-of": "^3.0.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.5"
+              }
+            }
           }
         },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+        "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.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
           "dev": true,
-          "optional": 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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
         }
       }
     },
-    "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"
+    "jest-image-snapshot": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/jest-image-snapshot/-/jest-image-snapshot-2.8.1.tgz",
+      "integrity": "sha512-/el/cknCo0pu7nopKg1Hu9PEaFNNIHIDpxxUGxYr/cYO7qSrIFAfUgRPDXGOJN2tqMu1tuwqaO+xlTWV86mjLw==",
+      "requires": {
+        "chalk": "^1.1.3",
+        "get-stdin": "^5.0.1",
+        "lodash": "^4.17.4",
+        "mkdirp": "^0.5.1",
+        "pixelmatch": "^4.0.2",
+        "pngjs": "^3.3.3",
+        "rimraf": "^2.6.2"
       },
       "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
+        "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.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "get-stdin": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
+          "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g="
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
         }
       }
     },
-    "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"
+    "jest-jasmine2": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.1.0.tgz",
+      "integrity": "sha512-H+o76SdSNyCh9fM5K8upK45YTo/DiFx5w2YAzblQebSQmukDcoVBVeXynyr7DDnxh+0NTHYRCLwJVf3tC518wg==",
+      "dev": true,
+      "requires": {
+        "@babel/traverse": "^7.1.0",
+        "chalk": "^2.0.1",
+        "co": "^4.6.0",
+        "expect": "^24.1.0",
+        "is-generator-fn": "^2.0.0",
+        "jest-each": "^24.0.0",
+        "jest-matcher-utils": "^24.0.0",
+        "jest-message-util": "^24.0.0",
+        "jest-snapshot": "^24.1.0",
+        "jest-util": "^24.0.0",
+        "pretty-format": "^24.0.0",
+        "throat": "^4.0.0"
       },
       "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"
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.3.tgz",
+          "integrity": "sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.3.3",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.11",
+            "source-map": "^0.5.0",
+            "trim-right": "^1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+          "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.0.0",
+            "@babel/template": "^7.1.0",
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+          "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+          "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.3.tgz",
+          "integrity": "sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg==",
+          "dev": true
+        },
+        "@babel/template": {
+          "version": "7.2.2",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+          "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/parser": "^7.2.2",
+            "@babel/types": "^7.2.2"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+          "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "@babel/generator": "^7.2.2",
+            "@babel/helper-function-name": "^7.1.0",
+            "@babel/helper-split-export-declaration": "^7.0.0",
+            "@babel/parser": "^7.2.3",
+            "@babel/types": "^7.2.2",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.10"
+          }
+        },
+        "@babel/types": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.3.tgz",
+          "integrity": "sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.11",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "globals": {
+          "version": "11.11.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz",
+          "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==",
+          "dev": true
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "dev": true
+        },
+        "jsesc": {
+          "version": "2.5.2",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "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==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+          "dev": true
+        }
       }
     },
-    "buffer": {
-      "version": "4.9.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
-      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+    "jest-junit": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-6.3.0.tgz",
+      "integrity": "sha512-3PH9UkpaomX6CUzqjlnk0m4yBCW/eroxV6v61OM6LkCQFO848P3YUhfIzu8ypZSBKB3vvCbB4WaLTKT0BrIf8A==",
+      "dev": true,
       "requires": {
-        "base64-js": "1.2.3",
-        "ieee754": "1.1.10",
-        "isarray": "1.0.0"
+        "jest-validate": "^24.0.0",
+        "mkdirp": "^0.5.1",
+        "strip-ansi": "^4.0.0",
+        "xml": "^1.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "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"
+          }
+        }
       }
     },
-    "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=",
+    "jest-leak-detector": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.0.0.tgz",
+      "integrity": "sha512-ZYHJYFeibxfsDSKowjDP332pStuiFT2xfc5R67Rjm/l+HFJWJgNIOCOlQGeXLCtyUn3A23+VVDdiCcnB6dTTrg==",
       "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"
+        "pretty-format": "^24.0.0"
       }
     },
-    "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==",
+    "jest-matcher-utils": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.0.0.tgz",
+      "integrity": "sha512-LQTDmO+aWRz1Tf9HJg+HlPHhDh1E1c65kVwRFo5mwCVp5aQDzlkz4+vCvXhOKFjitV2f0kMdHxnODrXVoi+rlA==",
+      "dev": true,
       "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"
+        "chalk": "^2.0.1",
+        "jest-diff": "^24.0.0",
+        "jest-get-type": "^24.0.0",
+        "pretty-format": "^24.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==",
+    "jest-message-util": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.0.0.tgz",
+      "integrity": "sha512-J9ROJIwz/IeC+eV1XSwnRK4oAwPuhmxEyYx1+K5UI+pIYwFZDSrfZaiWTdq0d2xYFw4Xiu+0KQWsdsQpgJMf3Q==",
+      "dev": true,
       "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"
+        "@babel/code-frame": "^7.0.0",
+        "chalk": "^2.0.1",
+        "micromatch": "^3.1.10",
+        "slash": "^2.0.0",
+        "stack-utils": "^1.0.1"
       },
       "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+          "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.0.0"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+          "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.0.0",
+            "esutils": "^2.0.2",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "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.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.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.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.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "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.0"
+              }
+            },
+            "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.0.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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "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.0"
+              }
+            }
+          }
+        },
+        "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.0"
+          },
+          "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.0"
+              }
+            }
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
         "isobject": {
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+          "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.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
         }
       }
     },
-    "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,
+    "jest-mock": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.0.0.tgz",
+      "integrity": "sha512-sQp0Hu5fcf5NZEh1U9eIW2qD0BwJZjb63Yqd98PQJFvf/zzUTBoUAwv/Dc/HFeNHIw1f3hl/48vNn+j3STaI7A==",
+      "dev": true
+    },
+    "jest-preset-angular": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-6.0.2.tgz",
+      "integrity": "sha512-uhrllY41tUvkeR41aX9bU5w3/EvvmwZiJ3UitDhRSEJL2Jvq2N/xKlmw7qvlZoGZnciFjOUJ2WDKv5fmCrvnQA==",
       "requires": {
-        "loader-utils": "1.1.0",
-        "mkdirp": "0.5.1",
-        "neo-async": "2.5.0",
-        "schema-utils": "0.4.5"
+        "jest-zone-patch": ">=0.0.9 <1.0.0",
+        "ts-jest": "~23.1.3"
       }
     },
-    "callsite": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
-      "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+    "jest-regex-util": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.0.0.tgz",
+      "integrity": "sha512-Jv/uOTCuC+PY7WpJl2mpoI+WbY2ut73qwwO9ByJJNwOCwr1qWhEW2Lyi2S9ZewUdJqeVpEBisdEVZSI+Zxo58Q==",
       "dev": true
     },
-    "camel-case": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
-      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+    "jest-resolve": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.1.0.tgz",
+      "integrity": "sha512-TPiAIVp3TG6zAxH28u/6eogbwrvZjBMWroSLBDkwkHKrqxB/RIdwkWDye4uqPlZIXWIaHtifY3L0/eO5Z0f2wg==",
+      "dev": true,
       "requires": {
-        "no-case": "2.3.2",
-        "upper-case": "1.1.3"
+        "browser-resolve": "^1.11.3",
+        "chalk": "^2.0.1",
+        "realpath-native": "^1.0.0"
       }
     },
-    "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=",
+    "jest-resolve-dependencies": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.1.0.tgz",
+      "integrity": "sha512-2VwPsjd3kRPu7qe2cpytAgowCObk5AKeizfXuuiwgm1a9sijJDZe8Kh1sFj6FKvSaNEfCPlBVkZEJa2482m/Uw==",
       "dev": true,
       "requires": {
-        "camelcase": "2.1.1",
-        "map-obj": "1.0.1"
+        "jest-regex-util": "^24.0.0",
+        "jest-snapshot": "^24.1.0"
       }
     },
-    "caniuse-api": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz",
-      "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=",
+    "jest-runner": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.1.0.tgz",
+      "integrity": "sha512-CDGOkT3AIFl16BLL/OdbtYgYvbAprwJ+ExKuLZmGSCSldwsuU2dEGauqkpvd9nphVdAnJUcP12e/EIlnTX0QXg==",
+      "dev": true,
       "requires": {
-        "browserslist": "1.7.7",
-        "caniuse-db": "1.0.30000827",
-        "lodash.memoize": "4.1.2",
-        "lodash.uniq": "4.5.0"
+        "chalk": "^2.4.2",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.1.15",
+        "jest-config": "^24.1.0",
+        "jest-docblock": "^24.0.0",
+        "jest-haste-map": "^24.0.0",
+        "jest-jasmine2": "^24.1.0",
+        "jest-leak-detector": "^24.0.0",
+        "jest-message-util": "^24.0.0",
+        "jest-runtime": "^24.1.0",
+        "jest-util": "^24.0.0",
+        "jest-worker": "^24.0.0",
+        "source-map-support": "^0.5.6",
+        "throat": "^4.0.0"
       },
       "dependencies": {
-        "browserslist": {
-          "version": "1.7.7",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
-          "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
           "requires": {
-            "caniuse-db": "1.0.30000827",
-            "electron-to-chromium": "1.3.39"
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
           }
         },
-        "lodash.memoize": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
-          "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
+        "graceful-fs": {
+          "version": "4.1.15",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+          "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "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.10",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz",
+          "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==",
+          "dev": true,
+          "requires": {
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "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"
+    "jest-runtime": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.1.0.tgz",
+      "integrity": "sha512-59/BY6OCuTXxGeDhEMU7+N33dpMQyXq7MLK07cNSIY/QYt2QZgJ7Tjx+rykBI0skAoigFl0A5tmT8UdwX92YuQ==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.1.0",
+        "babel-plugin-istanbul": "^5.1.0",
+        "chalk": "^2.0.1",
+        "convert-source-map": "^1.4.0",
+        "exit": "^0.1.2",
+        "fast-json-stable-stringify": "^2.0.0",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.1.15",
+        "jest-config": "^24.1.0",
+        "jest-haste-map": "^24.0.0",
+        "jest-message-util": "^24.0.0",
+        "jest-regex-util": "^24.0.0",
+        "jest-resolve": "^24.1.0",
+        "jest-snapshot": "^24.1.0",
+        "jest-util": "^24.0.0",
+        "jest-validate": "^24.0.0",
+        "micromatch": "^3.1.10",
+        "realpath-native": "^1.0.0",
+        "slash": "^2.0.0",
+        "strip-bom": "^3.0.0",
+        "write-file-atomic": "2.4.1",
+        "yargs": "^12.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="
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "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.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.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.0"
+              }
+            }
+          }
+        },
+        "camelcase": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
+          "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
+          "dev": true
+        },
+        "cliui": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+          "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^2.1.1",
+            "strip-ansi": "^4.0.0",
+            "wrap-ansi": "^2.0.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^4.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.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.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "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.0"
+              }
+            },
+            "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.0.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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "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.0"
+              }
+            }
+          }
+        },
+        "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.0"
+          },
+          "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.0"
+              }
+            }
+          }
         },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "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"
+            "locate-path": "^3.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=",
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.3",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+          "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+          "dev": true,
           "requires": {
-            "is-descriptor": "0.1.6"
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
         },
+        "graceful-fs": {
+          "version": "4.1.15",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+          "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+          "dev": true
+        },
+        "invert-kv": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
+          "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
+          "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"
+            "kind-of": "^3.0.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-buffer": "^1.1.5"
               }
             }
           }
           "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"
+            "kind-of": "^3.0.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-buffer": "^1.1.5"
               }
             }
           }
         },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+        "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
+        },
+        "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": {
-            "is-accessor-descriptor": "0.1.6",
-            "is-data-descriptor": "0.1.4",
-            "kind-of": "5.1.0"
+            "kind-of": "^3.0.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.5"
+              }
+            }
           }
         },
         "isobject": {
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
         },
         "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=",
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        },
+        "lcid": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+          "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
           "dev": true,
           "requires": {
-            "for-in": "1.0.2"
+            "invert-kv": "^2.0.0"
           }
         },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "mem": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz",
+          "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==",
+          "dev": true,
+          "requires": {
+            "map-age-cleaner": "^0.1.1",
+            "mimic-fn": "^1.0.0",
+            "p-is-promise": "^2.0.0"
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "os-locale": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
+          "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
+          "dev": true,
+          "requires": {
+            "execa": "^1.0.0",
+            "lcid": "^2.0.0",
+            "mem": "^4.0.0"
+          }
+        },
+        "p-is-promise": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz",
+          "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==",
           "dev": true
+        },
+        "p-limit": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz",
+          "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+          "dev": true
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "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
+        },
+        "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
+        },
+        "yargs": {
+          "version": "12.0.5",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
+          "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^4.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^3.0.0",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^2.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^3.2.1 || ^4.0.0",
+            "yargs-parser": "^11.1.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "11.1.1",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
+          "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
         }
       }
     },
-    "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=",
+    "jest-serializer": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.0.0.tgz",
+      "integrity": "sha512-9FKxQyrFgHtx3ozU+1a8v938ILBE7S8Ko3uiAVjT8Yfi2o91j/fj81jacCQZ/Ihjiff/VsUCXVgQ+iF1XdImOw==",
       "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"
+    "jest-snapshot": {
+      "version": "24.1.0",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.1.0.tgz",
+      "integrity": "sha512-th6TDfFqEmXvuViacU1ikD7xFb7lQsPn2rJl7OEmnfIVpnrx3QNY2t3PE88meeg0u/mQ0nkyvmC05PBqO4USFA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0",
+        "chalk": "^2.0.1",
+        "jest-diff": "^24.0.0",
+        "jest-matcher-utils": "^24.0.0",
+        "jest-message-util": "^24.0.0",
+        "jest-resolve": "^24.1.0",
+        "mkdirp": "^0.5.1",
+        "natural-compare": "^1.4.0",
+        "pretty-format": "^24.0.0",
+        "semver": "^5.5.0"
       },
       "dependencies": {
-        "finalhandler": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
-          "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+        "@babel/types": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.3.tgz",
+          "integrity": "sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ==",
           "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"
+            "esutils": "^2.0.2",
+            "lodash": "^4.17.11",
+            "to-fast-properties": "^2.0.0"
           }
         },
-        "statuses": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
-          "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        },
+        "to-fast-properties": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
           "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==",
+    "jest-sonar-reporter": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz",
+      "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==",
+      "dev": true,
       "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"
+        "xml": "^1.0.1"
       }
     },
-    "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==",
+    "jest-util": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.0.0.tgz",
+      "integrity": "sha512-QxsALc4wguYS7cfjdQSOr5HTkmjzkHgmZvIDkcmPfl1ib8PNV8QUWLwbKefCudWS0PRKioV+VbQ0oCUPC691fQ==",
       "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"
+        "callsites": "^3.0.0",
+        "chalk": "^2.0.1",
+        "graceful-fs": "^4.1.15",
+        "is-ci": "^2.0.0",
+        "jest-message-util": "^24.0.0",
+        "mkdirp": "^0.5.1",
+        "slash": "^2.0.0",
+        "source-map": "^0.6.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=",
+        "callsites": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz",
+          "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==",
           "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=",
+        "ci-info": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+          "dev": true
+        },
+        "graceful-fs": {
+          "version": "4.1.15",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+          "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+          "dev": true
+        },
+        "is-ci": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
           "dev": true,
           "requires": {
-            "is-extglob": "2.1.1"
+            "ci-info": "^2.0.0"
           }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "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
         }
-      }
-    },
-    "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=",
+      }
+    },
+    "jest-validate": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.0.0.tgz",
+      "integrity": "sha512-vMrKrTOP4BBFIeOWsjpsDgVXATxCspC9S1gqvbJ3Tnn/b9ACsJmteYeVx9830UMV28Cob1RX55x96Qq3Tfad4g==",
       "dev": true,
       "requires": {
-        "boom": "2.10.1"
+        "camelcase": "^5.0.0",
+        "chalk": "^2.0.1",
+        "jest-get-type": "^24.0.0",
+        "leven": "^2.1.0",
+        "pretty-format": "^24.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
+          "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
+          "dev": true
+        }
       }
     },
-    "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==",
+    "jest-watcher": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.0.0.tgz",
+      "integrity": "sha512-GxkW2QrZ4YxmW1GUWER05McjVDunBlKMFfExu+VsGmXJmpej1saTEKvONdx5RJBlVdpPI5x6E3+EDQSIGgl53g==",
+      "dev": true,
       "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"
+        "ansi-escapes": "^3.0.0",
+        "chalk": "^2.0.1",
+        "jest-util": "^24.0.0",
+        "string-length": "^2.0.0"
       }
     },
-    "css": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz",
-      "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=",
+    "jest-worker": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.0.0.tgz",
+      "integrity": "sha512-s64/OThpfQvoCeHG963MiEZOAAxu8kHsaL/rCMF7lpdzo7vgF0CtPml9hfguOMgykgH/eOm4jFP4ibfHLruytg==",
+      "dev": true,
       "requires": {
-        "inherits": "2.0.3",
-        "source-map": "0.1.43",
-        "source-map-resolve": "0.3.1",
-        "urix": "0.1.0"
+        "merge-stream": "^1.0.1",
+        "supports-color": "^6.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"
-          }
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
         },
-        "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=",
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
           "requires": {
-            "atob": "1.1.3",
-            "resolve-url": "0.2.1",
-            "source-map-url": "0.3.0",
-            "urix": "0.1.0"
+            "has-flag": "^3.0.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="
+    "jest-zone-patch": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/jest-zone-patch/-/jest-zone-patch-0.0.10.tgz",
+      "integrity": "sha512-K5uHLHgMgi2Eyj74gbY+xSeGGekb5U48bXsgDwgipRbFdaekyZK+TAcp8auamqU4UjrAt5S4sIUZz/2bBNyTTA=="
     },
-    "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==",
+    "js-base64": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.0.tgz",
+      "integrity": "sha512-wlEBIZ5LP8usDylWbDNhKPEFVFdI5hCHpnVoT/Ysvoi/PRhJENm/Rlh9TvjYB38HFfKZN7OzEbRjmjvLkFw11g==",
+      "dev": true,
+      "optional": true
+    },
+    "js-levenshtein": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz",
+      "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==",
+      "dev": true
+    },
+    "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==",
+      "dev": true,
       "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="
-        }
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
       }
     },
-    "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"
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "optional": true
+    },
+    "jsdom": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz",
+      "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.0",
+        "acorn": "^5.5.3",
+        "acorn-globals": "^4.1.0",
+        "array-equal": "^1.0.0",
+        "cssom": ">= 0.3.2 < 0.4.0",
+        "cssstyle": "^1.0.0",
+        "data-urls": "^1.0.0",
+        "domexception": "^1.0.1",
+        "escodegen": "^1.9.1",
+        "html-encoding-sniffer": "^1.0.2",
+        "left-pad": "^1.3.0",
+        "nwsapi": "^2.0.7",
+        "parse5": "4.0.0",
+        "pn": "^1.1.0",
+        "request": "^2.87.0",
+        "request-promise-native": "^1.0.5",
+        "sax": "^1.2.4",
+        "symbol-tree": "^3.2.2",
+        "tough-cookie": "^2.3.4",
+        "w3c-hr-time": "^1.0.1",
+        "webidl-conversions": "^4.0.2",
+        "whatwg-encoding": "^1.0.3",
+        "whatwg-mimetype": "^2.1.0",
+        "whatwg-url": "^6.4.1",
+        "ws": "^5.2.0",
+        "xml-name-validator": "^3.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=",
+        "ajv": {
+          "version": "6.9.1",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz",
+          "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==",
+          "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"
-          },
-          "dependencies": {
-            "supports-color": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
-            }
+            "fast-deep-equal": "^2.0.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
           }
         },
-        "has-flag": {
+        "assert-plus": {
           "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        },
+        "aws-sign2": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+          "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+          "dev": true
+        },
+        "aws4": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+          "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+          "dev": true
+        },
+        "extend": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+          "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+          "dev": true
+        },
+        "fast-deep-equal": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+          "dev": true
         },
-        "postcss": {
-          "version": "5.2.18",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
-          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+          "dev": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.6",
+            "mime-types": "^2.1.12"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "har-schema": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+          "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+          "dev": true
+        },
+        "har-validator": {
+          "version": "5.1.3",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+          "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.5.5",
+            "har-schema": "^2.0.0"
+          }
+        },
+        "http-signature": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+          "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+          "dev": true,
+          "requires": {
+            "assert-plus": "^1.0.0",
+            "jsprim": "^1.2.2",
+            "sshpk": "^1.7.0"
+          }
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true
+        },
+        "mime-db": {
+          "version": "1.38.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz",
+          "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==",
+          "dev": true
+        },
+        "mime-types": {
+          "version": "2.1.22",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz",
+          "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==",
+          "dev": true,
+          "requires": {
+            "mime-db": "~1.38.0"
+          }
+        },
+        "oauth-sign": {
+          "version": "0.9.0",
+          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+          "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+          "dev": true
+        },
+        "parse5": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+          "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+          "dev": true
+        },
+        "performance-now": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+          "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true
+        },
+        "request": {
+          "version": "2.88.0",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+          "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+          "dev": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "aws-sign2": "~0.7.0",
+            "aws4": "^1.8.0",
+            "caseless": "~0.12.0",
+            "combined-stream": "~1.0.6",
+            "extend": "~3.0.2",
+            "forever-agent": "~0.6.1",
+            "form-data": "~2.3.2",
+            "har-validator": "~5.1.0",
+            "http-signature": "~1.2.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.19",
+            "oauth-sign": "~0.9.0",
+            "performance-now": "^2.1.0",
+            "qs": "~6.5.2",
+            "safe-buffer": "^5.1.2",
+            "tough-cookie": "~2.4.3",
+            "tunnel-agent": "^0.6.0",
+            "uuid": "^3.3.2"
+          },
+          "dependencies": {
+            "tough-cookie": {
+              "version": "2.4.3",
+              "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+              "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+              "dev": true,
+              "requires": {
+                "psl": "^1.1.24",
+                "punycode": "^1.4.1"
+              }
+            }
           }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        },
+        "sax": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+          "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+          "dev": true
+        },
+        "uuid": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+          "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+          "dev": true
         }
       }
     },
-    "css-parse": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz",
-      "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=",
+    "jsesc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
+    },
+    "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==",
       "dev": true
     },
-    "css-select": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
-      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+    "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==",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+    },
+    "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=",
+      "dev": true
+    },
+    "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=",
       "requires": {
-        "boolbase": "1.0.0",
-        "css-what": "2.1.0",
-        "domutils": "1.5.1",
-        "nth-check": "1.0.1"
+        "jsonify": "~0.0.0"
       }
     },
-    "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=",
+    "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=",
+      "dev": true
+    },
+    "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=",
       "requires": {
-        "cssesc": "0.1.0",
-        "fastparse": "1.1.1",
-        "regexpu-core": "1.0.0"
+        "graceful-fs": "^4.1.6"
       }
     },
-    "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="
+    "jsonify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
     },
-    "cssauron": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
-      "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=",
-      "dev": true,
+    "jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+      "dev": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
       "requires": {
-        "through": "2.3.8"
+        "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="
+        }
       }
     },
-    "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"
+    "jwt-decode": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz",
+      "integrity": "sha1-fYa9VmefWM5qhHBKZX3TkruoGnk="
+    },
+    "karma-source-map-support": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz",
+      "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==",
+      "dev": true,
+      "requires": {
+        "source-map-support": "^0.5.5"
       },
       "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"
-          }
+        "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
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "source-map-support": {
+          "version": "0.5.9",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
+          "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
+          "dev": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.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=",
+    "killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
       "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=",
+    "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": {
-        "array-find-index": "1.0.2"
+        "is-buffer": "^1.1.5"
       }
     },
-    "custom-event": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
-      "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
+    "kleur": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.2.tgz",
+      "integrity": "sha512-3h7B2WRT5LNXOtQiAaWonilegHcPSf9nLVXlSTci8lu1dZUuui61+EsPEZqSVxY7rXYmB2DVKMQILxaO5WL61Q==",
       "dev": true
     },
-    "cyclist": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
-      "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA="
+    "lazy-ass": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
+      "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=",
+      "dev": true
     },
-    "cypress": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cypress/-/cypress-2.1.0.tgz",
-      "integrity": "sha512-EKXGjKFKUkhXXfAkYixBN2Lo2Gji4ZGC+ezWflRf/co49+OyHarZaXp7Y/n826WjmMdpHTmkOw4wUWBgyFHEHQ==",
+    "lazy-cache": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+      "dev": true
+    },
+    "lcid": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
       "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"
+        "invert-kv": "^1.0.0"
+      }
+    },
+    "left-pad": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
+      "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==",
+      "dev": true
+    },
+    "less": {
+      "version": "3.8.1",
+      "resolved": "https://registry.npmjs.org/less/-/less-3.8.1.tgz",
+      "integrity": "sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q==",
+      "dev": true,
+      "requires": {
+        "clone": "^2.1.2",
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "mime": "^1.4.1",
+        "mkdirp": "^0.5.0",
+        "promise": "^7.1.1",
+        "request": "^2.83.0",
+        "source-map": "~0.6.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
+        "ajv": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
+          "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fast-deep-equal": "^2.0.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
         },
-        "@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
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true,
+          "optional": 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
+        "aws-sign2": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+          "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+          "dev": true,
+          "optional": true
         },
-        "bluebird": {
-          "version": "3.5.0",
-          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
-          "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=",
-          "dev": true
+        "aws4": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+          "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+          "dev": true,
+          "optional": true
         },
-        "chalk": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz",
-          "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==",
+        "extend": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+          "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
           "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"
-              }
-            }
-          }
+          "optional": true
         },
-        "commander": {
-          "version": "2.11.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
-          "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
-          "dev": true
+        "fast-deep-equal": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+          "dev": true,
+          "optional": true
         },
-        "common-tags": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.4.0.tgz",
-          "integrity": "sha1-EYe+Tz1M8MBCfUP3Tu8fc1AWFMA=",
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
           "dev": true,
+          "optional": true,
           "requires": {
-            "babel-runtime": "6.26.0"
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.6",
+            "mime-types": "^2.1.12"
           }
         },
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+        "har-schema": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+          "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
           "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
+          "optional": true
         },
-        "fs-extra": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz",
-          "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=",
+        "har-validator": {
+          "version": "5.1.3",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+          "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
           "dev": true,
+          "optional": true,
           "requires": {
-            "graceful-fs": "4.1.11",
-            "jsonfile": "3.0.1",
-            "universalify": "0.1.1"
+            "ajv": "^6.5.5",
+            "har-schema": "^2.0.0"
           }
         },
-        "jsonfile": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
-          "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
+        "http-signature": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+          "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
           "dev": true,
+          "optional": true,
           "requires": {
-            "graceful-fs": "4.1.11"
+            "assert-plus": "^1.0.0",
+            "jsprim": "^1.2.2",
+            "sshpk": "^1.7.0"
           }
         },
-        "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
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true,
+          "optional": true
         },
-        "ramda": {
-          "version": "0.24.1",
-          "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz",
-          "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=",
+        "mime-db": {
+          "version": "1.37.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
+          "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
           "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=",
+        "mime-types": {
+          "version": "2.1.21",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
+          "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
           "dev": true,
           "requires": {
-            "throttleit": "0.0.2"
+            "mime-db": "~1.37.0"
           }
         },
-        "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==",
+        "oauth-sign": {
+          "version": "0.9.0",
+          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+          "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
           "dev": true,
-          "requires": {
-            "has-flag": "2.0.0"
-          }
+          "optional": true
         },
-        "throttleit": {
-          "version": "0.0.2",
-          "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
-          "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=",
-          "dev": true
+        "performance-now": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+          "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+          "dev": true,
+          "optional": true
         },
-        "tmp": {
-          "version": "0.0.31",
-          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz",
-          "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=",
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
           "dev": true,
-          "requires": {
-            "os-tmpdir": "1.0.2"
-          }
+          "optional": true
         },
-        "yauzl": {
-          "version": "2.8.0",
-          "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.8.0.tgz",
-          "integrity": "sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI=",
+        "request": {
+          "version": "2.88.0",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+          "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
           "dev": true,
+          "optional": true,
           "requires": {
-            "buffer-crc32": "0.2.13",
-            "fd-slicer": "1.0.1"
+            "aws-sign2": "~0.7.0",
+            "aws4": "^1.8.0",
+            "caseless": "~0.12.0",
+            "combined-stream": "~1.0.6",
+            "extend": "~3.0.2",
+            "forever-agent": "~0.6.1",
+            "form-data": "~2.3.2",
+            "har-validator": "~5.1.0",
+            "http-signature": "~1.2.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.19",
+            "oauth-sign": "~0.9.0",
+            "performance-now": "^2.1.0",
+            "qs": "~6.5.2",
+            "safe-buffer": "^5.1.2",
+            "tough-cookie": "~2.4.3",
+            "tunnel-agent": "^0.6.0",
+            "uuid": "^3.3.2"
           }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "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
+        },
+        "tough-cookie": {
+          "version": "2.4.3",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+          "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "psl": "^1.1.24",
+            "punycode": "^1.4.1"
+          }
+        },
+        "uuid": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+          "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+          "dev": true,
+          "optional": true
         }
       }
     },
-    "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=",
+    "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": {
-        "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"
+        "clone": "^2.1.1",
+        "loader-utils": "^1.1.0",
+        "pify": "^3.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=",
+    "leven": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
+      "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=",
       "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=",
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
       "requires": {
-        "foreach": "2.0.5",
-        "object-keys": "1.0.11"
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
       }
     },
-    "define-property": {
+    "license-webpack-plugin": {
       "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=",
+      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.0.2.tgz",
+      "integrity": "sha512-GsomZw5VoT20ST8qH2tOjBgbyhn6Pgs9M94g0mbvfBIV1VXufm1iKY+4dbgfTObj1Mp6nSRE3Zf74deOZr0KwA==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "ast-types": "0.11.3",
-        "escodegen": "1.9.1",
-        "esprima": "3.1.3"
+        "webpack-sources": "^1.2.0"
       },
       "dependencies": {
-        "esprima": {
-          "version": "3.1.3",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
-          "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+        "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
+        },
+        "webpack-sources": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
+          "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
           "dev": true,
-          "optional": true
+          "requires": {
+            "source-list-map": "^2.0.0",
+            "source-map": "~0.6.1"
+          }
         }
       }
     },
-    "del": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
-      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+    "lineclip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/lineclip/-/lineclip-1.1.5.tgz",
+      "integrity": "sha1-K/JgZ9lDVP6r+R5CdoI221YW/RM="
+    },
+    "listr": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz",
+      "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=",
       "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"
+        "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.0",
+        "log-symbols": "^1.0.2",
+        "log-update": "^1.0.2",
+        "ora": "^0.2.3",
+        "p-map": "^1.1.1",
+        "rxjs": "^5.0.0-beta.11",
+        "stream-to-observable": "^0.1.0",
+        "strip-ansi": "^3.0.1"
       },
       "dependencies": {
-        "globby": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+        "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": {
-            "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
-            }
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "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.0"
+          }
+        },
+        "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.0.0"
+          }
+        },
+        "rxjs": {
+          "version": "5.5.12",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz",
+          "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==",
+          "dev": true,
+          "requires": {
+            "symbol-observable": "1.0.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
+        },
+        "symbol-observable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
+          "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=",
+          "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"
-      }
+    "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
     },
-    "dom-converter": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz",
-      "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=",
+    "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": {
-        "utila": "0.3.3"
+        "chalk": "^1.1.3",
+        "cli-truncate": "^0.2.1",
+        "elegant-spinner": "^1.0.1",
+        "figures": "^1.7.0",
+        "indent-string": "^3.0.0",
+        "log-symbols": "^1.0.2",
+        "log-update": "^1.0.2",
+        "strip-ansi": "^3.0.1"
       },
       "dependencies": {
-        "utila": {
-          "version": "0.3.3",
-          "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
-          "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY="
+        "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.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "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.0"
+          }
+        },
+        "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
+        },
+        "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.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
         }
       }
     },
-    "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=",
+    "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": {
-        "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"
+        "chalk": "^1.1.3",
+        "cli-cursor": "^1.0.2",
+        "date-fns": "^1.27.2",
+        "figures": "^1.7.0"
       },
       "dependencies": {
-        "domelementtype": {
+        "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/domelementtype/-/domelementtype-1.1.3.tgz",
-          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
+          "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.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "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.0"
+          }
+        },
+        "onetime": {
+          "version": "1.1.0",
+          "resolved": "https://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.0.0",
+            "onetime": "^1.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
         }
       }
     },
-    "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=",
+    "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": {
-        "dom-serializer": "0.1.0",
-        "domelementtype": "1.3.0"
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "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
+        }
       }
     },
-    "dotenv": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz",
-      "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow=="
+    "loader-runner": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz",
+      "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=",
+      "dev": true
     },
-    "dotenv-webpack": {
-      "version": "1.5.5",
-      "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.5.5.tgz",
-      "integrity": "sha1-NEEJTwTTBLYRnmtyUk5i+zJS9fI=",
+    "loader-utils": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
+      "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
       "requires": {
-        "dotenv": "5.0.1"
+        "big.js": "^3.1.3",
+        "emojis-list": "^2.0.0",
+        "json5": "^0.5.0"
       }
     },
-    "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=",
+    "locate-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
       "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"
+        "p-locate": "^2.0.0",
+        "path-exists": "^3.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"
-      }
+    "lodash": {
+      "version": "4.17.5",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+      "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
     },
-    "ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+    "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
     },
-    "ejs": {
-      "version": "2.5.7",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz",
-      "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=",
+    "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
     },
-    "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="
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+      "dev": true
     },
-    "elegant-spinner": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz",
-      "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
+    "lodash.get": {
+      "version": "4.4.2",
+      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
       "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"
-      }
+    "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
     },
-    "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=",
+    "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
     },
-    "emojis-list": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
+    "lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+      "dev": true
     },
-    "encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+    "lodash.tail": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
+      "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=",
+      "dev": true
     },
-    "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"
-      }
+    "lodash.zip": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz",
+      "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA="
     },
-    "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==",
+    "log-symbols": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+      "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+      "dev": true,
       "requires": {
-        "once": "1.4.0"
+        "chalk": "^2.0.1"
       }
     },
-    "engine.io": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz",
-      "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==",
+    "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": {
-        "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"
+        "ansi-escapes": "^1.0.0",
+        "cli-cursor": "^1.0.2"
       },
       "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+        "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": {
-            "ms": "2.0.0"
+            "restore-cursor": "^1.0.1"
           }
-        }
-      }
-    },
-    "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==",
+        },
+        "onetime": {
+          "version": "1.1.0",
+          "resolved": "https://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": {
-            "ms": "2.0.0"
+            "exit-hook": "^1.0.0",
+            "onetime": "^1.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=",
+    "loglevel": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
+      "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
       "dev": true
     },
-    "entities": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
-      "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA="
+    "longest": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+      "dev": true
     },
-    "errno": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
-      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+    "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": {
-        "prr": "1.0.1"
+        "js-tokens": "^3.0.0"
       }
     },
-    "error-ex": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
-      "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "optional": true,
       "requires": {
-        "is-arrayish": "0.2.1"
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
       }
     },
-    "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==",
+    "lowercase-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+    },
+    "lru-cache": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
+      "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
+      "dev": true,
       "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"
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.2"
       }
     },
-    "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=",
+    "magic-string": {
+      "version": "0.25.1",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz",
+      "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==",
+      "dev": true,
       "requires": {
-        "is-callable": "1.1.3",
-        "is-date-object": "1.0.1",
-        "is-symbol": "1.0.1"
+        "sourcemap-codec": "^1.4.1"
       }
     },
-    "es5-ext": {
-      "version": "0.10.41",
-      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.41.tgz",
-      "integrity": "sha512-MYK02wXfwTMie5TEJWPolgOsXEmz7wKCQaGzgmRjZOoV6VLG8I5dSv2bn6AOClXhK64gnSQTQ9W9MKvx87J4gw==",
+    "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==",
+      "dev": true,
       "requires": {
-        "es6-iterator": "2.0.3",
-        "es6-symbol": "3.1.1",
-        "next-tick": "1.0.0"
+        "pify": "^3.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=="
+    "make-error": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
+      "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
+      "dev": true
     },
-    "es6-iterator": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
-      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+    "make-fetch-happen": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz",
+      "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==",
+      "dev": true,
+      "requires": {
+        "agentkeepalive": "^3.4.1",
+        "cacache": "^11.0.1",
+        "http-cache-semantics": "^3.8.1",
+        "http-proxy-agent": "^2.1.0",
+        "https-proxy-agent": "^2.2.1",
+        "lru-cache": "^4.1.2",
+        "mississippi": "^3.0.0",
+        "node-fetch-npm": "^2.0.2",
+        "promise-retry": "^1.1.1",
+        "socks-proxy-agent": "^4.0.0",
+        "ssri": "^6.0.0"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "11.3.2",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz",
+          "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.3",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.3",
+            "graceful-fs": "^4.1.15",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.2",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          },
+          "dependencies": {
+            "lru-cache": {
+              "version": "5.1.1",
+              "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+              "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+              "dev": true,
+              "requires": {
+                "yallist": "^3.0.2"
+              }
+            }
+          }
+        },
+        "glob": {
+          "version": "7.1.3",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+          "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "graceful-fs": {
+          "version": "4.1.15",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+          "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+          "dev": true
+        },
+        "mississippi": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+          "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+          "dev": true,
+          "requires": {
+            "concat-stream": "^1.5.0",
+            "duplexify": "^3.4.2",
+            "end-of-stream": "^1.1.0",
+            "flush-write-stream": "^1.0.0",
+            "from2": "^2.1.0",
+            "parallel-transform": "^1.1.0",
+            "pump": "^3.0.0",
+            "pumpify": "^1.3.3",
+            "stream-each": "^1.1.0",
+            "through2": "^2.0.0"
+          }
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
+          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
+          "dev": true
+        }
+      }
+    },
+    "makeerror": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
+      "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+      "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.41",
-        "es6-symbol": "3.1.1"
+        "tmpl": "1.0.x"
       }
     },
-    "es6-map": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
-      "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+    "map-age-cleaner": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+      "dev": true,
       "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"
+        "p-defer": "^1.0.0"
       }
     },
-    "es6-promise": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
-      "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
       "dev": true
     },
-    "es6-set": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
-      "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+    "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=",
+      "dev": true,
       "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"
+        "object-visit": "^1.0.0"
       }
     },
-    "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=",
+    "md5": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
+      "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.41"
+        "charenc": "~0.0.1",
+        "crypt": "~0.0.1",
+        "is-buffer": "~1.1.1"
       }
     },
-    "es6-templates": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz",
-      "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=",
+    "md5.js": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
+      "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=",
+      "dev": true,
       "requires": {
-        "recast": "0.11.23",
-        "through": "2.3.8"
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
       },
       "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=",
+        "hash-base": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+          "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+          "dev": true,
           "requires": {
-            "ast-types": "0.9.6",
-            "esprima": "3.1.3",
-            "private": "0.1.8",
-            "source-map": "0.5.7"
+            "inherits": "^2.0.1",
+            "safe-buffer": "^5.0.1"
           }
         }
       }
     },
-    "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=",
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true
+    },
+    "mem": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+      "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+      "dev": true,
       "requires": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.41",
-        "es6-iterator": "2.0.3",
-        "es6-symbol": "3.1.1"
+        "mimic-fn": "^1.0.0"
       }
     },
-    "escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+    "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=",
+      "dev": true,
+      "requires": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
     },
-    "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="
+    "memorystream": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+      "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
+      "dev": true
     },
-    "escodegen": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
-      "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
       "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"
+        "camelcase-keys": "^2.0.0",
+        "decamelize": "^1.1.2",
+        "loud-rejection": "^1.0.0",
+        "map-obj": "^1.0.1",
+        "minimist": "^1.1.3",
+        "normalize-package-data": "^2.3.4",
+        "object-assign": "^4.0.1",
+        "read-pkg-up": "^1.0.1",
+        "redent": "^1.0.0",
+        "trim-newlines": "^1.0.0"
       },
       "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==",
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
           "dev": true,
           "optional": true
         }
       }
     },
-    "escope": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
-      "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+    "merge": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
+      "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==",
+      "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=",
+      "dev": true
+    },
+    "merge-stream": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+      "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+      "dev": true,
       "requires": {
-        "es6-map": "0.1.5",
-        "es6-weak-map": "2.0.2",
-        "esrecurse": "4.2.1",
-        "estraverse": "4.2.0"
+        "readable-stream": "^2.0.1"
       }
     },
-    "esprima": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
-      "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "dev": true
     },
-    "esrecurse": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+    "micromatch": {
+      "version": "2.3.11",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+      "dev": true,
       "requires": {
-        "estraverse": "4.2.0"
+        "arr-diff": "^2.0.0",
+        "array-unique": "^0.2.1",
+        "braces": "^1.8.2",
+        "expand-brackets": "^0.1.4",
+        "extglob": "^0.3.1",
+        "filename-regex": "^2.0.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.1",
+        "kind-of": "^3.0.2",
+        "normalize-path": "^2.0.1",
+        "object.omit": "^2.0.0",
+        "parse-glob": "^3.0.4",
+        "regex-cache": "^0.4.2"
       }
     },
-    "estraverse": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      }
     },
-    "esutils": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+    "mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true,
+      "optional": true
     },
-    "etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+    "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=="
     },
-    "event-emitter": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
-      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+    "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": {
-        "d": "1.0.0",
-        "es5-ext": "0.10.41"
+        "mime-db": "~1.33.0"
       }
     },
-    "eventemitter3": {
+    "mimic-fn": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
-      "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
       "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=",
+    "mini-css-extract-plugin": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz",
+      "integrity": "sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ==",
+      "dev": true,
       "requires": {
-        "original": "1.0.0"
+        "loader-utils": "^1.1.0",
+        "schema-utils": "^1.0.0",
+        "webpack-sources": "^1.1.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"
-      }
+    "minimalistic-assert": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
+      "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=",
+      "dev": true
     },
-    "execa": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
-      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+    "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=",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
       "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"
-          }
-        }
+        "brace-expansion": "^1.1.7"
       }
     },
-    "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
+    "minimist": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
     },
-    "expand-braces": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz",
-      "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
+    "minipass": {
+      "version": "2.3.5",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
+      "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
       "dev": true,
       "requires": {
-        "array-slice": "0.2.3",
-        "array-unique": "0.2.1",
-        "braces": "0.1.5"
+        "safe-buffer": "^5.1.2",
+        "yallist": "^3.0.0"
       },
       "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=",
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
           "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=",
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
+          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
           "dev": true
         }
       }
     },
-    "expand-brackets": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
-      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+    "minizlib": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz",
+      "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
       "dev": true,
       "requires": {
-        "is-posix-bracket": "0.1.1"
+        "minipass": "^2.2.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=",
+    "mississippi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
+      "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==",
       "dev": true,
       "requires": {
-        "fill-range": "2.2.3"
+        "concat-stream": "^1.5.0",
+        "duplexify": "^3.4.2",
+        "end-of-stream": "^1.1.0",
+        "flush-write-stream": "^1.0.0",
+        "from2": "^2.1.0",
+        "parallel-transform": "^1.1.0",
+        "pump": "^2.0.1",
+        "pumpify": "^1.3.3",
+        "stream-each": "^1.1.0",
+        "through2": "^2.0.0"
       }
     },
-    "expand-tilde": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
-      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+    "mixin-deep": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+      "dev": true,
       "requires": {
-        "homedir-polyfill": "1.0.1"
+        "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==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
       }
     },
-    "express": {
-      "version": "4.16.3",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
-      "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
+    "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": {
-        "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"
+        "for-in": "^0.1.3",
+        "is-extendable": "^0.1.1"
       },
       "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=="
+        "for-in": {
+          "version": "0.1.8",
+          "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
+          "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=",
+          "dev": true
         }
       }
     },
-    "extend": {
+    "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/extend/-/extend-3.0.1.tgz",
-      "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
-      "dev": true
+      "resolved": "https://registry.npmjs.org/mobx-angular/-/mobx-angular-3.0.1.tgz",
+      "integrity": "sha512-PoEUEw74LoR7Ib6iGGCqvw8xMlmA/Zr5/0TVyhshq4kuzA8pHdvtCiE5AeyRK0w4LhyS7J0Qt0GboTgdhuys+A=="
     },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+    "moment": {
+      "version": "2.22.1",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz",
+      "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ=="
+    },
+    "monotone-convex-hull-2d": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz",
+      "integrity": "sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw=",
       "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"
-          }
-        }
+        "robust-orientation": "^1.1.3"
       }
     },
-    "external-editor": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
-      "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1",
+        "copy-concurrently": "^1.0.0",
+        "fs-write-stream-atomic": "^1.0.8",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.3"
+      }
+    },
+    "mri": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz",
+      "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==",
+      "dev": true
+    },
+    "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": {
-        "chardet": "0.4.2",
-        "iconv-lite": "0.4.19",
-        "tmp": "0.0.33"
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
       }
     },
-    "extglob": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
-      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+    "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
+    },
+    "multimatch": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz",
+      "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==",
       "dev": true,
       "requires": {
-        "is-extglob": "1.0.0"
+        "array-differ": "^2.0.3",
+        "array-union": "^1.0.2",
+        "arrify": "^1.0.1",
+        "minimatch": "^3.0.4"
       }
     },
-    "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,
+    "mute-stream": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+      "dev": true
+    },
+    "mv": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz",
+      "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=",
+      "optional": true,
       "requires": {
-        "async": "2.6.0",
-        "loader-utils": "1.1.0",
-        "schema-utils": "0.3.0",
-        "webpack-sources": "1.1.0"
+        "mkdirp": "~0.5.1",
+        "ncp": "~2.0.0",
+        "rimraf": "~2.4.0"
       },
       "dependencies": {
-        "ajv": {
-          "version": "5.5.2",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
-          "dev": true,
+        "glob": {
+          "version": "6.0.4",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+          "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+          "optional": 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"
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "2 || 3",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
         },
-        "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,
+        "rimraf": {
+          "version": "2.4.5",
+          "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
+          "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=",
+          "optional": true,
           "requires": {
-            "ajv": "5.5.2"
+            "glob": "^6.0.1"
           }
         }
       }
     },
-    "extract-zip": {
-      "version": "1.6.6",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz",
-      "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=",
+    "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==",
       "dev": true,
       "requires": {
-        "concat-stream": "1.6.0",
-        "debug": "2.6.9",
-        "mkdirp": "0.5.0",
-        "yauzl": "2.4.1"
+        "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.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.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"
-          }
+        "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
         },
-        "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"
-          }
+        "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
+        },
+        "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
         }
       }
     },
-    "extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
       "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,
+    "ncp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
+      "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
+      "optional": true
+    },
+    "needle": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/needle/-/needle-1.6.0.tgz",
+      "integrity": "sha1-9SpYWJchIWGOAC+OY4TK2sItYk8=",
       "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
-        }
+        "debug": "^2.1.2",
+        "iconv-lite": "^0.4.4"
       }
     },
-    "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="
+    "negotiator": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+      "dev": true
     },
-    "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="
+    "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==",
+      "dev": true
     },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+    "next-tick": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
       "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=="
+    "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=="
     },
-    "fastparse": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz",
-      "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg="
+    "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="
     },
-    "faye-websocket": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
-      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+    "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": "5.1.1",
+      "resolved": "https://registry.npmjs.org/ngx-contextmenu/-/ngx-contextmenu-5.1.1.tgz",
+      "integrity": "sha512-PORVcTo9txGonSaQx8y1ZyG526Na0LY/I4NSPIquMhwziqal/WGijHtOPSJ/AjGxLooMcWsh8DyGNEzOijWrOw==",
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "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.19.3",
+        "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="
+    },
+    "ngx-wallaby-jest": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/ngx-wallaby-jest/-/ngx-wallaby-jest-0.0.1.tgz",
+      "integrity": "sha512-dLVzxo4bzZwXG3EShUt119pTWvV8o572nMQA77LczMxxi/fWNGrGkkWx7+LiigoeGredvO9Htmlqtx4qPvcYGA==",
+      "dev": true,
+      "requires": {
+        "fs": "0.0.1-security"
+      }
+    },
+    "nice-try": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
+      "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==",
+      "dev": true
+    },
+    "node-fetch-npm": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz",
+      "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==",
       "dev": true,
       "requires": {
-        "websocket-driver": "0.7.0"
+        "encoding": "^0.1.11",
+        "json-parse-better-errors": "^1.0.0",
+        "safe-buffer": "^5.1.1"
       }
     },
-    "fbjs": {
-      "version": "0.8.16",
-      "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz",
-      "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=",
+    "node-forge": {
+      "version": "0.7.5",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
+      "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==",
+      "dev": true
+    },
+    "node-gyp": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+      "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
+      "dev": true,
+      "optional": true,
       "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"
+        "fstream": "^1.0.0",
+        "glob": "^7.0.3",
+        "graceful-fs": "^4.1.2",
+        "mkdirp": "^0.5.0",
+        "nopt": "2 || 3",
+        "npmlog": "0 || 1 || 2 || 3 || 4",
+        "osenv": "0",
+        "request": "^2.87.0",
+        "rimraf": "2",
+        "semver": "~5.3.0",
+        "tar": "^2.0.0",
+        "which": "1"
       },
       "dependencies": {
-        "core-js": {
-          "version": "1.2.7",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
-          "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
+        "ajv": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
+          "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fast-deep-equal": "^2.0.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true,
+          "optional": true
+        },
+        "aws-sign2": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+          "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+          "dev": true,
+          "optional": true
+        },
+        "aws4": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+          "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+          "dev": true,
+          "optional": true
+        },
+        "extend": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+          "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+          "dev": true,
+          "optional": true
+        },
+        "fast-deep-equal": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+          "dev": true,
+          "optional": true
+        },
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.6",
+            "mime-types": "^2.1.12"
+          }
+        },
+        "har-schema": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+          "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+          "dev": true,
+          "optional": true
+        },
+        "har-validator": {
+          "version": "5.1.3",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+          "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ajv": "^6.5.5",
+            "har-schema": "^2.0.0"
+          }
+        },
+        "http-signature": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+          "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "^1.0.0",
+            "jsprim": "^1.2.2",
+            "sshpk": "^1.7.0"
+          }
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true,
+          "optional": true
+        },
+        "mime-db": {
+          "version": "1.37.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
+          "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
+          "dev": true
+        },
+        "mime-types": {
+          "version": "2.1.21",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
+          "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
+          "dev": true,
+          "requires": {
+            "mime-db": "~1.37.0"
+          }
+        },
+        "oauth-sign": {
+          "version": "0.9.0",
+          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+          "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+          "dev": true,
+          "optional": true
+        },
+        "performance-now": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+          "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+          "dev": true,
+          "optional": true
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true,
+          "optional": true
+        },
+        "request": {
+          "version": "2.88.0",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+          "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aws-sign2": "~0.7.0",
+            "aws4": "^1.8.0",
+            "caseless": "~0.12.0",
+            "combined-stream": "~1.0.6",
+            "extend": "~3.0.2",
+            "forever-agent": "~0.6.1",
+            "form-data": "~2.3.2",
+            "har-validator": "~5.1.0",
+            "http-signature": "~1.2.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.19",
+            "oauth-sign": "~0.9.0",
+            "performance-now": "^2.1.0",
+            "qs": "~6.5.2",
+            "safe-buffer": "^5.1.2",
+            "tough-cookie": "~2.4.3",
+            "tunnel-agent": "^0.6.0",
+            "uuid": "^3.3.2"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true,
+          "optional": true
+        },
+        "semver": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+          "dev": true,
+          "optional": true
+        },
+        "tough-cookie": {
+          "version": "2.4.3",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+          "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "psl": "^1.1.24",
+            "punycode": "^1.4.1"
+          }
+        },
+        "uuid": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+          "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+          "dev": true,
+          "optional": true
         }
       }
     },
-    "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=",
+    "node-int64": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+      "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
       "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=",
+    "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==",
       "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"
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^1.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.0",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.10.3",
+        "vm-browserify": "0.0.4"
       }
     },
-    "find-cache-dir": {
+    "node-modules-regexp": {
       "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"
-      }
+      "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
+      "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
+      "dev": true
     },
-    "follow-redirects": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz",
-      "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=",
+    "node-notifier": {
+      "version": "5.4.0",
+      "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz",
+      "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==",
       "dev": true,
-      "optional": true,
       "requires": {
-        "debug": "2.6.9"
+        "growly": "^1.3.0",
+        "is-wsl": "^1.1.0",
+        "semver": "^5.5.0",
+        "shellwords": "^0.1.1",
+        "which": "^1.3.0"
       }
     },
-    "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=",
+    "node-releases": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.2.tgz",
+      "integrity": "sha512-j1gEV/zX821yxdWp/1vBMN0pSUjuH9oGUdLCb4PfUko6ZW7KdRs3Z+QGGwDUhYtSpQvdVVyLd2V0YvLsmdg5jQ==",
       "dev": true,
       "requires": {
-        "for-in": "1.0.2"
+        "semver": "^5.3.0"
       }
     },
-    "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=",
+    "node-sass": {
+      "version": "4.10.0",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.10.0.tgz",
+      "integrity": "sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q==",
       "dev": true,
+      "optional": 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"
+        "async-foreach": "^0.1.3",
+        "chalk": "^1.1.1",
+        "cross-spawn": "^3.0.0",
+        "gaze": "^1.0.0",
+        "get-stdin": "^4.0.1",
+        "glob": "^7.0.3",
+        "in-publish": "^2.0.0",
+        "lodash.assign": "^4.2.0",
+        "lodash.clonedeep": "^4.3.2",
+        "lodash.mergewith": "^4.6.0",
+        "meow": "^3.7.0",
+        "mkdirp": "^0.5.1",
+        "nan": "^2.10.0",
+        "node-gyp": "^3.8.0",
+        "npmlog": "^4.0.0",
+        "request": "^2.88.0",
+        "sass-graph": "^2.2.4",
+        "stdout-stream": "^1.4.0",
+        "true-case-path": "^1.0.2"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
+          "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fast-deep-equal": "^2.0.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "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
+        },
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true,
+          "optional": true
+        },
+        "aws-sign2": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+          "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+          "dev": true,
+          "optional": true
+        },
+        "aws4": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+          "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+          "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.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "extend": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+          "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+          "dev": true,
+          "optional": true
+        },
+        "fast-deep-equal": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+          "dev": true,
+          "optional": true
+        },
+        "form-data": {
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.6",
+            "mime-types": "^2.1.12"
+          }
+        },
+        "har-schema": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+          "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+          "dev": true,
+          "optional": true
+        },
+        "har-validator": {
+          "version": "5.1.3",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+          "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ajv": "^6.5.5",
+            "har-schema": "^2.0.0"
+          }
+        },
+        "http-signature": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+          "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "^1.0.0",
+            "jsprim": "^1.2.2",
+            "sshpk": "^1.7.0"
+          }
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+          "dev": true,
+          "optional": true
+        },
+        "mime-db": {
+          "version": "1.37.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
+          "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
+          "dev": true
+        },
+        "mime-types": {
+          "version": "2.1.21",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
+          "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
+          "dev": true,
+          "requires": {
+            "mime-db": "~1.37.0"
+          }
+        },
+        "oauth-sign": {
+          "version": "0.9.0",
+          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+          "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+          "dev": true,
+          "optional": true
+        },
+        "performance-now": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+          "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+          "dev": true,
+          "optional": true
+        },
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true,
+          "optional": true
+        },
+        "request": {
+          "version": "2.88.0",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+          "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aws-sign2": "~0.7.0",
+            "aws4": "^1.8.0",
+            "caseless": "~0.12.0",
+            "combined-stream": "~1.0.6",
+            "extend": "~3.0.2",
+            "forever-agent": "~0.6.1",
+            "form-data": "~2.3.2",
+            "har-validator": "~5.1.0",
+            "http-signature": "~1.2.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.19",
+            "oauth-sign": "~0.9.0",
+            "performance-now": "^2.1.0",
+            "qs": "~6.5.2",
+            "safe-buffer": "^5.1.2",
+            "tough-cookie": "~2.4.3",
+            "tunnel-agent": "^0.6.0",
+            "uuid": "^3.3.2"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true,
+          "optional": 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,
+          "optional": true
+        },
+        "tough-cookie": {
+          "version": "2.4.3",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+          "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "psl": "^1.1.24",
+            "punycode": "^1.4.1"
+          }
+        },
+        "uuid": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+          "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+          "dev": true,
+          "optional": true
+        }
       }
     },
-    "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=",
+    "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": {
-        "inherits": "2.0.3",
-        "readable-stream": "2.3.5"
+        "abbrev": "1"
       }
     },
-    "fs": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz",
-      "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=",
-      "dev": true
+    "nopt-usage": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/nopt-usage/-/nopt-usage-0.1.0.tgz",
+      "integrity": "sha1-sYuMGD4YEEfKnmO3zefPxwLMpXk="
     },
-    "fs-access": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
-      "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
+    "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==",
       "dev": true,
       "requires": {
-        "null-check": "1.0.0"
+        "hosted-git-info": "^2.1.4",
+        "is-builtin-module": "^1.0.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
       }
     },
-    "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==",
+    "normalize-path": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
       "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "jsonfile": "4.0.0",
-        "universalify": "0.1.1"
+        "remove-trailing-separator": "^1.0.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="
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+      "dev": true
     },
-    "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"
+    "npm": {
+      "version": "6.4.1",
+      "resolved": "https://registry.npmjs.org/npm/-/npm-6.4.1.tgz",
+      "integrity": "sha512-mXJL1NTVU136PtuopXCUQaNWuHlXCTp4McwlSW8S9/Aj8OEPAlSBgo8og7kJ01MjCDrkmqFQTvN5tTEhBMhXQg==",
+      "requires": {
+        "JSONStream": "^1.3.4",
+        "abbrev": "~1.1.1",
+        "ansicolors": "~0.3.2",
+        "ansistyles": "~0.1.3",
+        "aproba": "~1.2.0",
+        "archy": "~1.0.0",
+        "bin-links": "^1.1.2",
+        "bluebird": "~3.5.1",
+        "byte-size": "^4.0.3",
+        "cacache": "^11.2.0",
+        "call-limit": "~1.1.0",
+        "chownr": "~1.0.1",
+        "ci-info": "^1.4.0",
+        "cli-columns": "^3.1.2",
+        "cli-table3": "^0.5.0",
+        "cmd-shim": "~2.0.2",
+        "columnify": "~1.5.4",
+        "config-chain": "~1.1.11",
+        "debuglog": "*",
+        "detect-indent": "~5.0.0",
+        "detect-newline": "^2.1.0",
+        "dezalgo": "~1.0.3",
+        "editor": "~1.0.0",
+        "figgy-pudding": "^3.4.1",
+        "find-npm-prefix": "^1.0.2",
+        "fs-vacuum": "~1.2.10",
+        "fs-write-stream-atomic": "~1.0.10",
+        "gentle-fs": "^2.0.1",
+        "glob": "~7.1.2",
+        "graceful-fs": "~4.1.11",
+        "has-unicode": "~2.0.1",
+        "hosted-git-info": "^2.7.1",
+        "iferr": "^1.0.2",
+        "imurmurhash": "*",
+        "inflight": "~1.0.6",
+        "inherits": "~2.0.3",
+        "ini": "^1.3.5",
+        "init-package-json": "^1.10.3",
+        "is-cidr": "^2.0.6",
+        "json-parse-better-errors": "^1.0.2",
+        "lazy-property": "~1.0.0",
+        "libcipm": "^2.0.2",
+        "libnpmhook": "^4.0.1",
+        "libnpx": "^10.2.0",
+        "lock-verify": "^2.0.2",
+        "lockfile": "^1.0.4",
+        "lodash._baseindexof": "*",
+        "lodash._baseuniq": "~4.6.0",
+        "lodash._bindcallback": "*",
+        "lodash._cacheindexof": "*",
+        "lodash._createcache": "*",
+        "lodash._getnative": "*",
+        "lodash.clonedeep": "~4.5.0",
+        "lodash.restparam": "*",
+        "lodash.union": "~4.6.0",
+        "lodash.uniq": "~4.5.0",
+        "lodash.without": "~4.4.0",
+        "lru-cache": "^4.1.3",
+        "meant": "~1.0.1",
+        "mississippi": "^3.0.0",
+        "mkdirp": "~0.5.1",
+        "move-concurrently": "^1.0.1",
+        "node-gyp": "^3.8.0",
+        "nopt": "~4.0.1",
+        "normalize-package-data": "~2.4.0",
+        "npm-audit-report": "^1.3.1",
+        "npm-cache-filename": "~1.0.2",
+        "npm-install-checks": "~3.0.0",
+        "npm-lifecycle": "^2.1.0",
+        "npm-package-arg": "^6.1.0",
+        "npm-packlist": "^1.1.11",
+        "npm-pick-manifest": "^2.1.0",
+        "npm-profile": "^3.0.2",
+        "npm-registry-client": "^8.6.0",
+        "npm-registry-fetch": "^1.1.0",
+        "npm-user-validate": "~1.0.0",
+        "npmlog": "~4.1.2",
+        "once": "~1.4.0",
+        "opener": "^1.5.0",
+        "osenv": "^0.1.5",
+        "pacote": "^8.1.6",
+        "path-is-inside": "~1.0.2",
+        "promise-inflight": "~1.0.1",
+        "qrcode-terminal": "^0.12.0",
+        "query-string": "^6.1.0",
+        "qw": "~1.0.1",
+        "read": "~1.0.7",
+        "read-cmd-shim": "~1.0.1",
+        "read-installed": "~4.0.3",
+        "read-package-json": "^2.0.13",
+        "read-package-tree": "^5.2.1",
+        "readable-stream": "^2.3.6",
+        "readdir-scoped-modules": "*",
+        "request": "^2.88.0",
+        "retry": "^0.12.0",
+        "rimraf": "~2.6.2",
+        "safe-buffer": "^5.1.2",
+        "semver": "^5.5.0",
+        "sha": "~2.0.1",
+        "slide": "~1.1.6",
+        "sorted-object": "~2.0.1",
+        "sorted-union-stream": "~2.1.3",
+        "ssri": "^6.0.0",
+        "stringify-package": "^1.0.0",
+        "tar": "^4.4.6",
+        "text-table": "~0.2.0",
+        "tiny-relative-date": "^1.3.0",
+        "uid-number": "0.0.6",
+        "umask": "~1.1.0",
+        "unique-filename": "~1.1.0",
+        "unpipe": "~1.0.0",
+        "update-notifier": "^2.5.0",
+        "uuid": "^3.3.2",
+        "validate-npm-package-license": "^3.0.4",
+        "validate-npm-package-name": "~3.0.0",
+        "which": "^1.3.1",
+        "worker-farm": "^1.6.0",
+        "write-file-atomic": "^2.3.0"
       },
       "dependencies": {
+        "JSONStream": {
+          "version": "1.3.4",
+          "bundled": true,
+          "requires": {
+            "jsonparse": "^1.2.0",
+            "through": ">=2.2.7 <3"
+          }
+        },
         "abbrev": {
-          "version": "1.1.0",
+          "version": "1.1.1",
+          "bundled": true
+        },
+        "agent-base": {
+          "version": "4.2.0",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "es6-promisify": "^5.0.0"
+          }
+        },
+        "agentkeepalive": {
+          "version": "3.4.1",
+          "bundled": true,
+          "requires": {
+            "humanize-ms": "^1.2.1"
+          }
         },
         "ajv": {
-          "version": "4.11.8",
+          "version": "5.5.2",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "co": "4.6.0",
-            "json-stable-stringify": "1.0.1"
+            "co": "^4.6.0",
+            "fast-deep-equal": "^1.0.0",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.3.0"
+          }
+        },
+        "ansi-align": {
+          "version": "2.0.0",
+          "bundled": true,
+          "requires": {
+            "string-width": "^2.0.0"
           }
         },
         "ansi-regex": {
           "version": "2.1.1",
           "bundled": true
         },
-        "aproba": {
-          "version": "1.1.1",
+        "ansi-styles": {
+          "version": "3.2.1",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "ansicolors": {
+          "version": "0.3.2",
+          "bundled": true
+        },
+        "ansistyles": {
+          "version": "0.1.3",
+          "bundled": true
+        },
+        "aproba": {
+          "version": "1.2.0",
+          "bundled": true
+        },
+        "archy": {
+          "version": "1.0.0",
+          "bundled": true
         },
         "are-we-there-yet": {
           "version": "1.1.4",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "delegates": "1.0.0",
-            "readable-stream": "2.2.9"
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.6"
           }
         },
+        "asap": {
+          "version": "2.0.6",
+          "bundled": true
+        },
         "asn1": {
-          "version": "0.2.3",
+          "version": "0.2.4",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "safer-buffer": "~2.1.0"
+          }
         },
         "assert-plus": {
-          "version": "0.2.0",
-          "bundled": true,
-          "optional": true
+          "version": "1.0.0",
+          "bundled": true
         },
         "asynckit": {
           "version": "0.4.0",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "aws-sign2": {
-          "version": "0.6.0",
-          "bundled": true,
-          "optional": true
+          "version": "0.7.0",
+          "bundled": true
         },
         "aws4": {
-          "version": "1.6.0",
-          "bundled": true,
-          "optional": true
+          "version": "1.8.0",
+          "bundled": true
         },
         "balanced-match": {
-          "version": "0.4.2",
+          "version": "1.0.0",
           "bundled": true
         },
         "bcrypt-pbkdf": {
-          "version": "1.0.1",
+          "version": "1.0.2",
           "bundled": true,
           "optional": true,
           "requires": {
-            "tweetnacl": "0.14.5"
+            "tweetnacl": "^0.14.3"
+          }
+        },
+        "bin-links": {
+          "version": "1.1.2",
+          "bundled": true,
+          "requires": {
+            "bluebird": "^3.5.0",
+            "cmd-shim": "^2.0.2",
+            "gentle-fs": "^2.0.0",
+            "graceful-fs": "^4.1.11",
+            "write-file-atomic": "^2.3.0"
           }
         },
         "block-stream": {
           "version": "0.0.9",
           "bundled": true,
           "requires": {
-            "inherits": "2.0.3"
+            "inherits": "~2.0.0"
           }
         },
-        "boom": {
-          "version": "2.10.1",
+        "bluebird": {
+          "version": "3.5.1",
+          "bundled": true
+        },
+        "boxen": {
+          "version": "1.3.0",
           "bundled": true,
           "requires": {
-            "hoek": "2.16.3"
+            "ansi-align": "^2.0.0",
+            "camelcase": "^4.0.0",
+            "chalk": "^2.0.1",
+            "cli-boxes": "^1.0.0",
+            "string-width": "^2.0.0",
+            "term-size": "^1.2.0",
+            "widest-line": "^2.0.0"
           }
         },
         "brace-expansion": {
-          "version": "1.1.7",
+          "version": "1.1.11",
           "bundled": true,
           "requires": {
-            "balanced-match": "0.4.2",
+            "balanced-match": "^1.0.0",
             "concat-map": "0.0.1"
           }
         },
-        "buffer-shims": {
+        "buffer-from": {
           "version": "1.0.0",
           "bundled": true
         },
-        "caseless": {
-          "version": "0.12.0",
-          "bundled": true,
-          "optional": true
+        "builtin-modules": {
+          "version": "1.1.1",
+          "bundled": true
         },
-        "co": {
-          "version": "4.6.0",
-          "bundled": true,
-          "optional": true
+        "builtins": {
+          "version": "1.0.3",
+          "bundled": true
         },
-        "code-point-at": {
+        "byline": {
+          "version": "5.0.0",
+          "bundled": true
+        },
+        "byte-size": {
+          "version": "4.0.3",
+          "bundled": true
+        },
+        "cacache": {
+          "version": "11.2.0",
+          "bundled": true,
+          "requires": {
+            "bluebird": "^3.5.1",
+            "chownr": "^1.0.1",
+            "figgy-pudding": "^3.1.0",
+            "glob": "^7.1.2",
+            "graceful-fs": "^4.1.11",
+            "lru-cache": "^4.1.3",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.2",
+            "ssri": "^6.0.0",
+            "unique-filename": "^1.1.0",
+            "y18n": "^4.0.0"
+          }
+        },
+        "call-limit": {
           "version": "1.1.0",
           "bundled": true
         },
-        "combined-stream": {
-          "version": "1.0.5",
+        "camelcase": {
+          "version": "4.1.0",
+          "bundled": true
+        },
+        "capture-stack-trace": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "caseless": {
+          "version": "0.12.0",
+          "bundled": true
+        },
+        "chalk": {
+          "version": "2.4.1",
           "bundled": true,
           "requires": {
-            "delayed-stream": "1.0.0"
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
           }
         },
-        "concat-map": {
-          "version": "0.0.1",
+        "chownr": {
+          "version": "1.0.1",
           "bundled": true
         },
-        "console-control-strings": {
-          "version": "1.1.0",
+        "ci-info": {
+          "version": "1.4.0",
           "bundled": true
         },
-        "core-util-is": {
-          "version": "1.0.2",
+        "cidr-regex": {
+          "version": "2.0.9",
+          "bundled": true,
+          "requires": {
+            "ip-regex": "^2.1.0"
+          }
+        },
+        "cli-boxes": {
+          "version": "1.0.0",
           "bundled": true
         },
-        "cryptiles": {
-          "version": "2.0.5",
+        "cli-columns": {
+          "version": "3.1.2",
           "bundled": true,
           "requires": {
-            "boom": "2.10.1"
+            "string-width": "^2.0.0",
+            "strip-ansi": "^3.0.1"
           }
         },
-        "dashdash": {
-          "version": "1.14.1",
+        "cli-table3": {
+          "version": "0.5.0",
+          "bundled": true,
+          "requires": {
+            "colors": "^1.1.2",
+            "object-assign": "^4.1.0",
+            "string-width": "^2.1.1"
+          }
+        },
+        "cliui": {
+          "version": "4.1.0",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "assert-plus": "1.0.0"
+            "string-width": "^2.1.1",
+            "strip-ansi": "^4.0.0",
+            "wrap-ansi": "^2.0.0"
           },
           "dependencies": {
-            "assert-plus": {
-              "version": "1.0.0",
+            "ansi-regex": {
+              "version": "3.0.0",
+              "bundled": true
+            },
+            "strip-ansi": {
+              "version": "4.0.0",
               "bundled": true,
-              "optional": true
+              "requires": {
+                "ansi-regex": "^3.0.0"
+              }
             }
           }
         },
-        "debug": {
-          "version": "2.6.8",
+        "clone": {
+          "version": "1.0.4",
+          "bundled": true
+        },
+        "cmd-shim": {
+          "version": "2.0.2",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "ms": "2.0.0"
+            "graceful-fs": "^4.1.2",
+            "mkdirp": "~0.5.0"
           }
         },
-        "deep-extend": {
-          "version": "0.4.2",
-          "bundled": true,
-          "optional": true
-        },
-        "delayed-stream": {
-          "version": "1.0.0",
+        "co": {
+          "version": "4.6.0",
           "bundled": true
         },
-        "delegates": {
-          "version": "1.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "detect-libc": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true
         },
-        "ecc-jsbn": {
-          "version": "0.1.1",
+        "color-convert": {
+          "version": "1.9.1",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "jsbn": "0.1.1"
+            "color-name": "^1.1.1"
           }
         },
-        "extend": {
-          "version": "3.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "extsprintf": {
-          "version": "1.0.2",
+        "color-name": {
+          "version": "1.1.3",
           "bundled": true
         },
-        "forever-agent": {
-          "version": "0.6.1",
+        "colors": {
+          "version": "1.1.2",
           "bundled": true,
           "optional": true
         },
-        "form-data": {
-          "version": "2.1.4",
+        "columnify": {
+          "version": "1.5.4",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "asynckit": "0.4.0",
-            "combined-stream": "1.0.5",
-            "mime-types": "2.1.15"
+            "strip-ansi": "^3.0.0",
+            "wcwidth": "^1.0.0"
           }
         },
-        "fs.realpath": {
-          "version": "1.0.0",
+        "combined-stream": {
+          "version": "1.0.6",
+          "bundled": true,
+          "requires": {
+            "delayed-stream": "~1.0.0"
+          }
+        },
+        "concat-map": {
+          "version": "0.0.1",
           "bundled": true
         },
-        "fstream": {
-          "version": "1.0.11",
+        "concat-stream": {
+          "version": "1.6.2",
           "bundled": true,
           "requires": {
-            "graceful-fs": "4.1.11",
-            "inherits": "2.0.3",
-            "mkdirp": "0.5.1",
-            "rimraf": "2.6.1"
+            "buffer-from": "^1.0.0",
+            "inherits": "^2.0.3",
+            "readable-stream": "^2.2.2",
+            "typedarray": "^0.0.6"
           }
         },
-        "fstream-ignore": {
-          "version": "1.0.5",
+        "config-chain": {
+          "version": "1.1.11",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "fstream": "1.0.11",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4"
+            "ini": "^1.3.4",
+            "proto-list": "~1.2.1"
           }
         },
-        "gauge": {
-          "version": "2.7.4",
+        "configstore": {
+          "version": "3.1.2",
           "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"
+            "dot-prop": "^4.1.0",
+            "graceful-fs": "^4.1.2",
+            "make-dir": "^1.0.0",
+            "unique-string": "^1.0.0",
+            "write-file-atomic": "^2.0.0",
+            "xdg-basedir": "^3.0.0"
           }
         },
-        "getpass": {
-          "version": "0.1.7",
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "copy-concurrently": {
+          "version": "1.0.5",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "assert-plus": "1.0.0"
+            "aproba": "^1.1.1",
+            "fs-write-stream-atomic": "^1.0.8",
+            "iferr": "^0.1.5",
+            "mkdirp": "^0.5.1",
+            "rimraf": "^2.5.4",
+            "run-queue": "^1.0.0"
           },
           "dependencies": {
-            "assert-plus": {
-              "version": "1.0.0",
-              "bundled": true,
-              "optional": true
+            "iferr": {
+              "version": "0.1.5",
+              "bundled": true
             }
           }
         },
-        "glob": {
-          "version": "7.1.2",
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "create-error-class": {
+          "version": "3.0.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"
+            "capture-stack-trace": "^1.0.0"
           }
         },
-        "graceful-fs": {
-          "version": "4.1.11",
+        "cross-spawn": {
+          "version": "5.1.0",
+          "bundled": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "crypto-random-string": {
+          "version": "1.0.0",
           "bundled": true
         },
-        "har-schema": {
-          "version": "1.0.5",
-          "bundled": true,
-          "optional": true
+        "cyclist": {
+          "version": "0.2.2",
+          "bundled": true
         },
-        "har-validator": {
-          "version": "4.2.1",
+        "dashdash": {
+          "version": "1.14.1",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "ajv": "4.11.8",
-            "har-schema": "1.0.5"
+            "assert-plus": "^1.0.0"
           }
         },
-        "has-unicode": {
-          "version": "2.0.1",
+        "debug": {
+          "version": "3.1.0",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "ms": "2.0.0"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.0.0",
+              "bundled": true
+            }
+          }
         },
-        "hawk": {
-          "version": "3.1.3",
+        "debuglog": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "decamelize": {
+          "version": "1.2.0",
+          "bundled": true
+        },
+        "decode-uri-component": {
+          "version": "0.2.0",
+          "bundled": true
+        },
+        "deep-extend": {
+          "version": "0.5.1",
+          "bundled": true
+        },
+        "defaults": {
+          "version": "1.0.3",
           "bundled": true,
           "requires": {
-            "boom": "2.10.1",
-            "cryptiles": "2.0.5",
-            "hoek": "2.16.3",
-            "sntp": "1.0.9"
+            "clone": "^1.0.2"
           }
         },
-        "hoek": {
-          "version": "2.16.3",
+        "delayed-stream": {
+          "version": "1.0.0",
           "bundled": true
         },
-        "http-signature": {
-          "version": "1.1.1",
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "detect-indent": {
+          "version": "5.0.0",
+          "bundled": true
+        },
+        "detect-newline": {
+          "version": "2.1.0",
+          "bundled": true
+        },
+        "dezalgo": {
+          "version": "1.0.3",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "assert-plus": "0.2.0",
-            "jsprim": "1.4.0",
-            "sshpk": "1.13.0"
+            "asap": "^2.0.0",
+            "wrappy": "1"
           }
         },
-        "inflight": {
-          "version": "1.0.6",
+        "dot-prop": {
+          "version": "4.2.0",
           "bundled": true,
           "requires": {
-            "once": "1.4.0",
-            "wrappy": "1.0.2"
+            "is-obj": "^1.0.0"
           }
         },
-        "inherits": {
-          "version": "2.0.3",
+        "dotenv": {
+          "version": "5.0.1",
           "bundled": true
         },
-        "ini": {
-          "version": "1.3.4",
-          "bundled": true,
-          "optional": true
+        "duplexer3": {
+          "version": "0.1.4",
+          "bundled": true
         },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
+        "duplexify": {
+          "version": "3.6.0",
           "bundled": true,
           "requires": {
-            "number-is-nan": "1.0.1"
+            "end-of-stream": "^1.0.0",
+            "inherits": "^2.0.1",
+            "readable-stream": "^2.0.0",
+            "stream-shift": "^1.0.0"
           }
         },
-        "is-typedarray": {
-          "version": "1.0.0",
+        "ecc-jsbn": {
+          "version": "0.1.2",
           "bundled": true,
-          "optional": true
+          "optional": true,
+          "requires": {
+            "jsbn": "~0.1.0",
+            "safer-buffer": "^2.1.0"
+          }
         },
-        "isarray": {
+        "editor": {
           "version": "1.0.0",
           "bundled": true
         },
-        "isstream": {
-          "version": "0.1.2",
+        "encoding": {
+          "version": "0.1.12",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "iconv-lite": "~0.4.13"
+          }
         },
-        "jodid25519": {
-          "version": "1.0.2",
+        "end-of-stream": {
+          "version": "1.4.1",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "jsbn": "0.1.1"
+            "once": "^1.4.0"
           }
         },
-        "jsbn": {
-          "version": "0.1.1",
-          "bundled": true,
-          "optional": true
+        "err-code": {
+          "version": "1.1.2",
+          "bundled": true
         },
-        "json-schema": {
-          "version": "0.2.3",
+        "errno": {
+          "version": "0.1.7",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "prr": "~1.0.1"
+          }
         },
-        "json-stable-stringify": {
-          "version": "1.0.1",
+        "es6-promise": {
+          "version": "4.2.4",
+          "bundled": true
+        },
+        "es6-promisify": {
+          "version": "5.0.0",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "jsonify": "0.0.0"
+            "es6-promise": "^4.0.3"
           }
         },
-        "json-stringify-safe": {
-          "version": "5.0.1",
+        "escape-string-regexp": {
+          "version": "1.0.5",
+          "bundled": true
+        },
+        "execa": {
+          "version": "0.7.0",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
         },
-        "jsonify": {
-          "version": "0.0.0",
+        "extend": {
+          "version": "3.0.2",
+          "bundled": true
+        },
+        "extsprintf": {
+          "version": "1.3.0",
+          "bundled": true
+        },
+        "fast-deep-equal": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "fast-json-stable-stringify": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "figgy-pudding": {
+          "version": "3.4.1",
+          "bundled": true
+        },
+        "find-npm-prefix": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "find-up": {
+          "version": "2.1.0",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
         },
-        "jsprim": {
-          "version": "1.4.0",
+        "flush-write-stream": {
+          "version": "1.0.3",
           "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
-            }
+            "inherits": "^2.0.1",
+            "readable-stream": "^2.0.4"
           }
         },
-        "mime-db": {
-          "version": "1.27.0",
+        "forever-agent": {
+          "version": "0.6.1",
           "bundled": true
         },
-        "mime-types": {
-          "version": "2.1.15",
+        "form-data": {
+          "version": "2.3.2",
           "bundled": true,
           "requires": {
-            "mime-db": "1.27.0"
+            "asynckit": "^0.4.0",
+            "combined-stream": "1.0.6",
+            "mime-types": "^2.1.12"
           }
         },
-        "minimatch": {
-          "version": "3.0.4",
+        "from2": {
+          "version": "2.3.0",
           "bundled": true,
           "requires": {
-            "brace-expansion": "1.1.7"
+            "inherits": "^2.0.1",
+            "readable-stream": "^2.0.0"
           }
         },
-        "minimist": {
-          "version": "0.0.8",
-          "bundled": true
+        "fs-minipass": {
+          "version": "1.2.5",
+          "bundled": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
         },
-        "mkdirp": {
-          "version": "0.5.1",
+        "fs-vacuum": {
+          "version": "1.2.10",
           "bundled": true,
           "requires": {
-            "minimist": "0.0.8"
+            "graceful-fs": "^4.1.2",
+            "path-is-inside": "^1.0.1",
+            "rimraf": "^2.5.2"
           }
         },
-        "ms": {
-          "version": "2.0.0",
+        "fs-write-stream-atomic": {
+          "version": "1.0.10",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "iferr": "^0.1.5",
+            "imurmurhash": "^0.1.4",
+            "readable-stream": "1 || 2"
+          },
+          "dependencies": {
+            "iferr": {
+              "version": "0.1.5",
+              "bundled": true
+            }
+          }
         },
-        "node-pre-gyp": {
-          "version": "0.6.39",
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "fstream": {
+          "version": "1.0.11",
           "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"
+            "graceful-fs": "^4.1.2",
+            "inherits": "~2.0.0",
+            "mkdirp": ">=0.5 0",
+            "rimraf": "2"
           }
         },
-        "nopt": {
-          "version": "4.0.1",
+        "gauge": {
+          "version": "2.7.4",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "abbrev": "1.1.0",
-            "osenv": "0.1.4"
+            "aproba": "^1.0.3",
+            "console-control-strings": "^1.0.0",
+            "has-unicode": "^2.0.0",
+            "object-assign": "^4.1.0",
+            "signal-exit": "^3.0.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wide-align": "^1.1.0"
+          },
+          "dependencies": {
+            "string-width": {
+              "version": "1.0.2",
+              "bundled": true,
+              "requires": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+              }
+            }
           }
         },
-        "npmlog": {
-          "version": "4.1.0",
+        "genfun": {
+          "version": "4.0.1",
+          "bundled": true
+        },
+        "gentle-fs": {
+          "version": "2.0.1",
           "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"
+            "aproba": "^1.1.2",
+            "fs-vacuum": "^1.2.10",
+            "graceful-fs": "^4.1.11",
+            "iferr": "^0.1.5",
+            "mkdirp": "^0.5.1",
+            "path-is-inside": "^1.0.2",
+            "read-cmd-shim": "^1.0.1",
+            "slide": "^1.1.6"
+          },
+          "dependencies": {
+            "iferr": {
+              "version": "0.1.5",
+              "bundled": true
+            }
           }
         },
-        "number-is-nan": {
-          "version": "1.0.1",
+        "get-caller-file": {
+          "version": "1.0.2",
           "bundled": true
         },
-        "oauth-sign": {
-          "version": "0.8.2",
-          "bundled": true,
-          "optional": true
+        "get-stream": {
+          "version": "3.0.0",
+          "bundled": true
         },
-        "object-assign": {
-          "version": "4.1.1",
+        "getpass": {
+          "version": "0.1.7",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "assert-plus": "^1.0.0"
+          }
         },
-        "once": {
-          "version": "1.4.0",
+        "glob": {
+          "version": "7.1.2",
           "bundled": true,
           "requires": {
-            "wrappy": "1.0.2"
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
         },
-        "os-homedir": {
-          "version": "1.0.2",
+        "global-dirs": {
+          "version": "0.1.1",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "ini": "^1.3.4"
+          }
         },
-        "os-tmpdir": {
-          "version": "1.0.2",
+        "got": {
+          "version": "6.7.1",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "create-error-class": "^3.0.0",
+            "duplexer3": "^0.1.4",
+            "get-stream": "^3.0.0",
+            "is-redirect": "^1.0.0",
+            "is-retry-allowed": "^1.0.0",
+            "is-stream": "^1.0.0",
+            "lowercase-keys": "^1.0.0",
+            "safe-buffer": "^5.0.1",
+            "timed-out": "^4.0.0",
+            "unzip-response": "^2.0.1",
+            "url-parse-lax": "^1.0.0"
+          }
         },
-        "osenv": {
-          "version": "0.1.4",
+        "graceful-fs": {
+          "version": "4.1.11",
+          "bundled": true
+        },
+        "har-schema": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "har-validator": {
+          "version": "5.1.0",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "os-homedir": "1.0.2",
-            "os-tmpdir": "1.0.2"
+            "ajv": "^5.3.0",
+            "har-schema": "^2.0.0"
           }
         },
-        "path-is-absolute": {
-          "version": "1.0.1",
+        "has-flag": {
+          "version": "3.0.0",
           "bundled": true
         },
-        "performance-now": {
-          "version": "0.2.0",
-          "bundled": true,
-          "optional": true
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true
         },
-        "process-nextick-args": {
-          "version": "1.0.7",
+        "hosted-git-info": {
+          "version": "2.7.1",
           "bundled": true
         },
-        "punycode": {
-          "version": "1.4.1",
-          "bundled": true,
-          "optional": true
+        "http-cache-semantics": {
+          "version": "3.8.1",
+          "bundled": true
         },
-        "qs": {
-          "version": "6.4.0",
+        "http-proxy-agent": {
+          "version": "2.1.0",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "agent-base": "4",
+            "debug": "3.1.0"
+          }
         },
-        "rc": {
-          "version": "1.2.1",
+        "http-signature": {
+          "version": "1.2.0",
           "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
-            }
+            "assert-plus": "^1.0.0",
+            "jsprim": "^1.2.2",
+            "sshpk": "^1.7.0"
           }
         },
-        "readable-stream": {
-          "version": "2.2.9",
+        "https-proxy-agent": {
+          "version": "2.2.1",
           "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"
+            "agent-base": "^4.1.0",
+            "debug": "^3.1.0"
           }
         },
-        "request": {
-          "version": "2.81.0",
+        "humanize-ms": {
+          "version": "1.2.1",
           "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"
+            "ms": "^2.0.0"
           }
         },
-        "rimraf": {
-          "version": "2.6.1",
+        "iconv-lite": {
+          "version": "0.4.23",
           "bundled": true,
           "requires": {
-            "glob": "7.1.2"
+            "safer-buffer": ">= 2.1.2 < 3"
           }
         },
-        "safe-buffer": {
-          "version": "5.0.1",
+        "iferr": {
+          "version": "1.0.2",
           "bundled": true
         },
-        "semver": {
-          "version": "5.3.0",
+        "ignore-walk": {
+          "version": "3.0.1",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "minimatch": "^3.0.4"
+          }
         },
-        "set-blocking": {
-          "version": "2.0.0",
-          "bundled": true,
-          "optional": true
+        "import-lazy": {
+          "version": "2.1.0",
+          "bundled": true
         },
-        "signal-exit": {
-          "version": "3.0.2",
-          "bundled": true,
-          "optional": true
+        "imurmurhash": {
+          "version": "0.1.4",
+          "bundled": true
         },
-        "sntp": {
-          "version": "1.0.9",
+        "inflight": {
+          "version": "1.0.6",
           "bundled": true,
           "requires": {
-            "hoek": "2.16.3"
+            "once": "^1.3.0",
+            "wrappy": "1"
           }
         },
-        "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
-            }
-          }
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": 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"
-          }
+        "ini": {
+          "version": "1.3.5",
+          "bundled": true
         },
-        "string_decoder": {
-          "version": "1.0.1",
+        "init-package-json": {
+          "version": "1.10.3",
           "bundled": true,
           "requires": {
-            "safe-buffer": "5.0.1"
+            "glob": "^7.1.1",
+            "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0",
+            "promzard": "^0.3.0",
+            "read": "~1.0.1",
+            "read-package-json": "1 || 2",
+            "semver": "2.x || 3.x || 4 || 5",
+            "validate-npm-package-license": "^3.0.1",
+            "validate-npm-package-name": "^3.0.0"
           }
         },
-        "stringstream": {
-          "version": "0.0.5",
-          "bundled": true,
-          "optional": true
+        "invert-kv": {
+          "version": "1.0.0",
+          "bundled": true
         },
-        "strip-ansi": {
-          "version": "3.0.1",
+        "ip": {
+          "version": "1.1.5",
+          "bundled": true
+        },
+        "ip-regex": {
+          "version": "2.1.0",
+          "bundled": true
+        },
+        "is-builtin-module": {
+          "version": "1.0.0",
           "bundled": true,
           "requires": {
-            "ansi-regex": "2.1.1"
+            "builtin-modules": "^1.0.0"
           }
         },
-        "strip-json-comments": {
-          "version": "2.0.1",
+        "is-ci": {
+          "version": "1.1.0",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "ci-info": "^1.0.0"
+          }
         },
-        "tar": {
-          "version": "2.2.1",
+        "is-cidr": {
+          "version": "2.0.6",
           "bundled": true,
           "requires": {
-            "block-stream": "0.0.9",
-            "fstream": "1.0.11",
-            "inherits": "2.0.3"
+            "cidr-regex": "^2.0.8"
           }
         },
-        "tar-pack": {
-          "version": "3.4.0",
+        "is-fullwidth-code-point": {
+          "version": "1.0.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"
+            "number-is-nan": "^1.0.0"
           }
         },
-        "tough-cookie": {
-          "version": "2.3.2",
+        "is-installed-globally": {
+          "version": "0.1.0",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "punycode": "1.4.1"
+            "global-dirs": "^0.1.0",
+            "is-path-inside": "^1.0.0"
           }
         },
-        "tunnel-agent": {
-          "version": "0.6.0",
+        "is-npm": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "is-obj": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "is-path-inside": {
+          "version": "1.0.1",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "safe-buffer": "5.0.1"
+            "path-is-inside": "^1.0.1"
           }
         },
-        "tweetnacl": {
-          "version": "0.14.5",
-          "bundled": true,
-          "optional": true
+        "is-redirect": {
+          "version": "1.0.0",
+          "bundled": true
         },
-        "uid-number": {
-          "version": "0.0.6",
+        "is-retry-allowed": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "is-stream": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "is-typedarray": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "isexe": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "isstream": {
+          "version": "0.1.2",
+          "bundled": true
+        },
+        "jsbn": {
+          "version": "0.1.1",
           "bundled": true,
           "optional": true
         },
-        "util-deprecate": {
+        "json-parse-better-errors": {
           "version": "1.0.2",
           "bundled": true
         },
-        "uuid": {
-          "version": "3.0.1",
+        "json-schema": {
+          "version": "0.2.3",
+          "bundled": true
+        },
+        "json-schema-traverse": {
+          "version": "0.3.1",
+          "bundled": true
+        },
+        "json-stringify-safe": {
+          "version": "5.0.1",
+          "bundled": true
+        },
+        "jsonparse": {
+          "version": "1.3.1",
+          "bundled": true
+        },
+        "jsprim": {
+          "version": "1.4.1",
+          "bundled": true,
+          "requires": {
+            "assert-plus": "1.0.0",
+            "extsprintf": "1.3.0",
+            "json-schema": "0.2.3",
+            "verror": "1.10.0"
+          }
+        },
+        "latest-version": {
+          "version": "3.1.0",
+          "bundled": true,
+          "requires": {
+            "package-json": "^4.0.0"
+          }
+        },
+        "lazy-property": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "lcid": {
+          "version": "1.0.0",
           "bundled": true,
-          "optional": true
+          "requires": {
+            "invert-kv": "^1.0.0"
+          }
         },
-        "verror": {
-          "version": "1.3.6",
+        "libcipm": {
+          "version": "2.0.2",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "extsprintf": "1.0.2"
+            "bin-links": "^1.1.2",
+            "bluebird": "^3.5.1",
+            "find-npm-prefix": "^1.0.2",
+            "graceful-fs": "^4.1.11",
+            "lock-verify": "^2.0.2",
+            "mkdirp": "^0.5.1",
+            "npm-lifecycle": "^2.0.3",
+            "npm-logical-tree": "^1.2.1",
+            "npm-package-arg": "^6.1.0",
+            "pacote": "^8.1.6",
+            "protoduck": "^5.0.0",
+            "read-package-json": "^2.0.13",
+            "rimraf": "^2.6.2",
+            "worker-farm": "^1.6.0"
+          }
+        },
+        "libnpmhook": {
+          "version": "4.0.1",
+          "bundled": true,
+          "requires": {
+            "figgy-pudding": "^3.1.0",
+            "npm-registry-fetch": "^3.0.0"
+          },
+          "dependencies": {
+            "npm-registry-fetch": {
+              "version": "3.1.1",
+              "bundled": true,
+              "requires": {
+                "bluebird": "^3.5.1",
+                "figgy-pudding": "^3.1.0",
+                "lru-cache": "^4.1.2",
+                "make-fetch-happen": "^4.0.0",
+                "npm-package-arg": "^6.0.0"
+              }
+            }
           }
         },
-        "wide-align": {
-          "version": "1.1.2",
+        "libnpx": {
+          "version": "10.2.0",
           "bundled": true,
-          "optional": true,
           "requires": {
-            "string-width": "1.0.2"
+            "dotenv": "^5.0.1",
+            "npm-package-arg": "^6.0.0",
+            "rimraf": "^2.6.2",
+            "safe-buffer": "^5.1.0",
+            "update-notifier": "^2.3.0",
+            "which": "^1.3.0",
+            "y18n": "^4.0.0",
+            "yargs": "^11.0.0"
           }
         },
-        "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
+        "locate-path": {
+          "version": "2.0.0",
+          "bundled": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
         },
-        "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,
+        "lock-verify": {
+          "version": "2.0.2",
+          "bundled": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "0.0.1",
-            "string_decoder": "0.10.31"
+            "npm-package-arg": "^5.1.2 || 6",
+            "semver": "^5.4.1"
           }
         },
-        "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,
+        "lockfile": {
+          "version": "1.0.4",
+          "bundled": true,
           "requires": {
-            "lodash": "4.17.5"
+            "signal-exit": "^3.0.2"
           }
-        }
-      }
-    },
-    "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,
+        "lodash._baseindexof": {
+          "version": "3.1.0",
+          "bundled": true
+        },
+        "lodash._baseuniq": {
+          "version": "4.6.0",
+          "bundled": 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"
+            "lodash._createset": "~4.0.0",
+            "lodash._root": "~3.0.0"
           }
         },
-        "minimist": {
+        "lodash._bindcallback": {
+          "version": "3.0.1",
+          "bundled": true
+        },
+        "lodash._cacheindexof": {
+          "version": "3.0.2",
+          "bundled": true
+        },
+        "lodash._createcache": {
+          "version": "3.1.2",
+          "bundled": true,
+          "requires": {
+            "lodash._getnative": "^3.0.0"
+          }
+        },
+        "lodash._createset": {
+          "version": "4.0.3",
+          "bundled": true
+        },
+        "lodash._getnative": {
+          "version": "3.9.1",
+          "bundled": true
+        },
+        "lodash._root": {
+          "version": "3.0.1",
+          "bundled": true
+        },
+        "lodash.clonedeep": {
+          "version": "4.5.0",
+          "bundled": true
+        },
+        "lodash.restparam": {
+          "version": "3.6.1",
+          "bundled": true
+        },
+        "lodash.union": {
+          "version": "4.6.0",
+          "bundled": true
+        },
+        "lodash.uniq": {
+          "version": "4.5.0",
+          "bundled": true
+        },
+        "lodash.without": {
+          "version": "4.4.0",
+          "bundled": true
+        },
+        "lowercase-keys": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "lru-cache": {
+          "version": "4.1.3",
+          "bundled": true,
+          "requires": {
+            "pseudomap": "^1.0.2",
+            "yallist": "^2.1.2"
+          }
+        },
+        "make-dir": {
+          "version": "1.3.0",
+          "bundled": true,
+          "requires": {
+            "pify": "^3.0.0"
+          }
+        },
+        "make-fetch-happen": {
+          "version": "4.0.1",
+          "bundled": true,
+          "requires": {
+            "agentkeepalive": "^3.4.1",
+            "cacache": "^11.0.1",
+            "http-cache-semantics": "^3.8.1",
+            "http-proxy-agent": "^2.1.0",
+            "https-proxy-agent": "^2.2.1",
+            "lru-cache": "^4.1.2",
+            "mississippi": "^3.0.0",
+            "node-fetch-npm": "^2.0.2",
+            "promise-retry": "^1.1.1",
+            "socks-proxy-agent": "^4.0.0",
+            "ssri": "^6.0.0"
+          }
+        },
+        "meant": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "mem": {
+          "version": "1.1.0",
+          "bundled": true,
+          "requires": {
+            "mimic-fn": "^1.0.0"
+          }
+        },
+        "mime-db": {
+          "version": "1.35.0",
+          "bundled": true
+        },
+        "mime-types": {
+          "version": "2.1.19",
+          "bundled": true,
+          "requires": {
+            "mime-db": "~1.35.0"
+          }
+        },
+        "mimic-fn": {
           "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
+          "bundled": 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
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
         },
-        "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
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true
         },
-        "camelcase": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
-          "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
-          "dev": true,
-          "optional": true
+        "minipass": {
+          "version": "2.3.3",
+          "bundled": true,
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          },
+          "dependencies": {
+            "yallist": {
+              "version": "3.0.2",
+              "bundled": 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,
+        "minizlib": {
+          "version": "1.1.0",
+          "bundled": true,
           "requires": {
-            "center-align": "0.1.3",
-            "right-align": "0.1.3",
-            "wordwrap": "0.0.2"
+            "minipass": "^2.2.1"
           }
         },
-        "source-map": {
-          "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
-          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
-          "dev": true,
+        "mississippi": {
+          "version": "3.0.0",
+          "bundled": true,
           "requires": {
-            "amdefine": "1.0.1"
+            "concat-stream": "^1.5.0",
+            "duplexify": "^3.4.2",
+            "end-of-stream": "^1.1.0",
+            "flush-write-stream": "^1.0.0",
+            "from2": "^2.1.0",
+            "parallel-transform": "^1.1.0",
+            "pump": "^3.0.0",
+            "pumpify": "^1.3.3",
+            "stream-each": "^1.1.0",
+            "through2": "^2.0.0"
           }
         },
-        "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,
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "move-concurrently": {
+          "version": "1.0.1",
+          "bundled": true,
+          "requires": {
+            "aproba": "^1.1.1",
+            "copy-concurrently": "^1.0.0",
+            "fs-write-stream-atomic": "^1.0.8",
+            "mkdirp": "^0.5.1",
+            "rimraf": "^2.5.4",
+            "run-queue": "^1.0.3"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "bundled": true
+        },
+        "mute-stream": {
+          "version": "0.0.7",
+          "bundled": true
+        },
+        "node-fetch-npm": {
+          "version": "2.0.2",
+          "bundled": true,
+          "requires": {
+            "encoding": "^0.1.11",
+            "json-parse-better-errors": "^1.0.0",
+            "safe-buffer": "^5.1.1"
+          }
+        },
+        "node-gyp": {
+          "version": "3.8.0",
+          "bundled": true,
           "requires": {
-            "source-map": "0.5.7",
-            "uglify-to-browserify": "1.0.2",
-            "yargs": "3.10.0"
+            "fstream": "^1.0.0",
+            "glob": "^7.0.3",
+            "graceful-fs": "^4.1.2",
+            "mkdirp": "^0.5.0",
+            "nopt": "2 || 3",
+            "npmlog": "0 || 1 || 2 || 3 || 4",
+            "osenv": "0",
+            "request": "^2.87.0",
+            "rimraf": "2",
+            "semver": "~5.3.0",
+            "tar": "^2.0.0",
+            "which": "1"
           },
           "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
+            "nopt": {
+              "version": "3.0.6",
+              "bundled": true,
+              "requires": {
+                "abbrev": "1"
+              }
+            },
+            "semver": {
+              "version": "5.3.0",
+              "bundled": true
+            },
+            "tar": {
+              "version": "2.2.1",
+              "bundled": true,
+              "requires": {
+                "block-stream": "*",
+                "fstream": "^1.0.2",
+                "inherits": "2"
+              }
             }
           }
         },
-        "yargs": {
-          "version": "3.10.0",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
-          "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
-          "dev": true,
-          "optional": true,
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
           "requires": {
-            "camelcase": "1.2.1",
-            "cliui": "2.1.0",
-            "decamelize": "1.2.0",
-            "window-size": "0.1.0"
+            "abbrev": "1",
+            "osenv": "^0.1.4"
           }
-        }
-      }
-    },
-    "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,
+        },
+        "normalize-package-data": {
+          "version": "2.4.0",
+          "bundled": true,
+          "requires": {
+            "hosted-git-info": "^2.1.4",
+            "is-builtin-module": "^1.0.0",
+            "semver": "2 || 3 || 4 || 5",
+            "validate-npm-package-license": "^3.0.1"
+          }
+        },
+        "npm-audit-report": {
+          "version": "1.3.1",
+          "bundled": true,
+          "requires": {
+            "cli-table3": "^0.5.0",
+            "console-control-strings": "^1.1.0"
+          }
+        },
+        "npm-bundled": {
+          "version": "1.0.5",
+          "bundled": true
+        },
+        "npm-cache-filename": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "npm-install-checks": {
+          "version": "3.0.0",
+          "bundled": true,
+          "requires": {
+            "semver": "^2.3.0 || 3.x || 4 || 5"
+          }
+        },
+        "npm-lifecycle": {
+          "version": "2.1.0",
+          "bundled": true,
+          "requires": {
+            "byline": "^5.0.0",
+            "graceful-fs": "^4.1.11",
+            "node-gyp": "^3.8.0",
+            "resolve-from": "^4.0.0",
+            "slide": "^1.1.6",
+            "uid-number": "0.0.6",
+            "umask": "^1.1.0",
+            "which": "^1.3.1"
+          }
+        },
+        "npm-logical-tree": {
+          "version": "1.2.1",
+          "bundled": true
+        },
+        "npm-package-arg": {
+          "version": "6.1.0",
+          "bundled": true,
           "requires": {
-            "co": "4.6.0",
-            "json-stable-stringify": "1.0.1"
+            "hosted-git-info": "^2.6.0",
+            "osenv": "^0.1.5",
+            "semver": "^5.5.0",
+            "validate-npm-package-name": "^3.0.0"
           }
-        }
-      }
-    },
-    "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=",
+        },
+        "npm-packlist": {
+          "version": "1.1.11",
+          "bundled": true,
+          "requires": {
+            "ignore-walk": "^3.0.1",
+            "npm-bundled": "^1.0.1"
+          }
+        },
+        "npm-pick-manifest": {
+          "version": "2.1.0",
+          "bundled": true,
+          "requires": {
+            "npm-package-arg": "^6.0.0",
+            "semver": "^5.4.1"
+          }
+        },
+        "npm-profile": {
+          "version": "3.0.2",
+          "bundled": true,
+          "requires": {
+            "aproba": "^1.1.2 || 2",
+            "make-fetch-happen": "^2.5.0 || 3 || 4"
+          }
+        },
+        "npm-registry-client": {
+          "version": "8.6.0",
+          "bundled": true,
           "requires": {
-            "kind-of": "3.2.2"
+            "concat-stream": "^1.5.2",
+            "graceful-fs": "^4.1.6",
+            "normalize-package-data": "~1.0.1 || ^2.0.0",
+            "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0",
+            "npmlog": "2 || ^3.1.0 || ^4.0.0",
+            "once": "^1.3.3",
+            "request": "^2.74.0",
+            "retry": "^0.10.0",
+            "safe-buffer": "^5.1.1",
+            "semver": "2 >=2.2.1 || 3.x || 4 || 5",
+            "slide": "^1.1.3",
+            "ssri": "^5.2.4"
           },
           "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+            "retry": {
+              "version": "0.10.1",
+              "bundled": true
+            },
+            "ssri": {
+              "version": "5.3.0",
+              "bundled": true,
               "requires": {
-                "is-buffer": "1.1.6"
+                "safe-buffer": "^5.1.1"
               }
             }
           }
         },
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+        "npm-registry-fetch": {
+          "version": "1.1.0",
+          "bundled": true,
+          "requires": {
+            "bluebird": "^3.5.1",
+            "figgy-pudding": "^2.0.1",
+            "lru-cache": "^4.1.2",
+            "make-fetch-happen": "^3.0.0",
+            "npm-package-arg": "^6.0.0",
+            "safe-buffer": "^5.1.1"
+          },
+          "dependencies": {
+            "cacache": {
+              "version": "10.0.4",
+              "bundled": true,
+              "requires": {
+                "bluebird": "^3.5.1",
+                "chownr": "^1.0.1",
+                "glob": "^7.1.2",
+                "graceful-fs": "^4.1.11",
+                "lru-cache": "^4.1.1",
+                "mississippi": "^2.0.0",
+                "mkdirp": "^0.5.1",
+                "move-concurrently": "^1.0.1",
+                "promise-inflight": "^1.0.1",
+                "rimraf": "^2.6.2",
+                "ssri": "^5.2.4",
+                "unique-filename": "^1.1.0",
+                "y18n": "^4.0.0"
+              },
+              "dependencies": {
+                "mississippi": {
+                  "version": "2.0.0",
+                  "bundled": true,
+                  "requires": {
+                    "concat-stream": "^1.5.0",
+                    "duplexify": "^3.4.2",
+                    "end-of-stream": "^1.1.0",
+                    "flush-write-stream": "^1.0.0",
+                    "from2": "^2.1.0",
+                    "parallel-transform": "^1.1.0",
+                    "pump": "^2.0.1",
+                    "pumpify": "^1.3.3",
+                    "stream-each": "^1.1.0",
+                    "through2": "^2.0.0"
+                  }
+                }
+              }
+            },
+            "figgy-pudding": {
+              "version": "2.0.1",
+              "bundled": true
+            },
+            "make-fetch-happen": {
+              "version": "3.0.0",
+              "bundled": true,
+              "requires": {
+                "agentkeepalive": "^3.4.1",
+                "cacache": "^10.0.4",
+                "http-cache-semantics": "^3.8.1",
+                "http-proxy-agent": "^2.1.0",
+                "https-proxy-agent": "^2.2.0",
+                "lru-cache": "^4.1.2",
+                "mississippi": "^3.0.0",
+                "node-fetch-npm": "^2.0.2",
+                "promise-retry": "^1.1.1",
+                "socks-proxy-agent": "^3.0.1",
+                "ssri": "^5.2.4"
+              }
+            },
+            "pump": {
+              "version": "2.0.1",
+              "bundled": true,
+              "requires": {
+                "end-of-stream": "^1.1.0",
+                "once": "^1.3.1"
+              }
+            },
+            "smart-buffer": {
+              "version": "1.1.15",
+              "bundled": true
+            },
+            "socks": {
+              "version": "1.1.10",
+              "bundled": true,
+              "requires": {
+                "ip": "^1.1.4",
+                "smart-buffer": "^1.0.13"
+              }
+            },
+            "socks-proxy-agent": {
+              "version": "3.0.1",
+              "bundled": true,
+              "requires": {
+                "agent-base": "^4.1.0",
+                "socks": "^1.1.10"
+              }
+            },
+            "ssri": {
+              "version": "5.3.0",
+              "bundled": true,
+              "requires": {
+                "safe-buffer": "^5.1.1"
+              }
+            }
+          }
+        },
+        "npm-run-path": {
+          "version": "2.0.2",
+          "bundled": true,
           "requires": {
-            "is-buffer": "1.1.6"
+            "path-key": "^2.0.0"
           }
-        }
-      }
-    },
-    "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=",
+        },
+        "npm-user-validate": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "npmlog": {
+          "version": "4.1.2",
+          "bundled": true,
+          "requires": {
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.3",
+            "set-blocking": "~2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "oauth-sign": {
+          "version": "0.9.0",
+          "bundled": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
           "requires": {
-            "big.js": "3.2.0",
-            "emojis-list": "2.1.0",
-            "json5": "0.5.1",
-            "object-assign": "4.1.1"
+            "wrappy": "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=",
+        },
+        "opener": {
+          "version": "1.5.0",
+          "bundled": true
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "os-locale": {
+          "version": "2.1.0",
+          "bundled": true,
           "requires": {
-            "domelementtype": "1.3.0"
+            "execa": "^0.7.0",
+            "lcid": "^1.0.0",
+            "mem": "^1.1.0"
           }
         },
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true
         },
-        "readable-stream": {
-          "version": "1.0.34",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+        "osenv": {
+          "version": "0.1.5",
+          "bundled": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "0.0.1",
-            "string_decoder": "0.10.31"
+            "os-homedir": "^1.0.0",
+            "os-tmpdir": "^1.0.0"
           }
         },
-        "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="
+        "p-finally": {
+          "version": "1.0.0",
+          "bundled": true
         },
-        "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
+        "p-limit": {
+          "version": "1.2.0",
+          "bundled": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
         },
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
+        "p-locate": {
+          "version": "2.0.0",
+          "bundled": true,
           "requires": {
-            "is-extglob": "2.1.1"
+            "p-limit": "^1.1.0"
           }
-        }
-      }
-    },
-    "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": {
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "package-json": {
+          "version": "4.0.1",
+          "bundled": true,
+          "requires": {
+            "got": "^6.7.1",
+            "registry-auth-token": "^3.0.1",
+            "registry-url": "^3.0.3",
+            "semver": "^5.1.0"
+          }
+        },
+        "pacote": {
+          "version": "8.1.6",
+          "bundled": true,
+          "requires": {
+            "bluebird": "^3.5.1",
+            "cacache": "^11.0.2",
+            "get-stream": "^3.0.0",
+            "glob": "^7.1.2",
+            "lru-cache": "^4.1.3",
+            "make-fetch-happen": "^4.0.1",
+            "minimatch": "^3.0.4",
+            "minipass": "^2.3.3",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "normalize-package-data": "^2.4.0",
+            "npm-package-arg": "^6.1.0",
+            "npm-packlist": "^1.1.10",
+            "npm-pick-manifest": "^2.1.0",
+            "osenv": "^0.1.5",
+            "promise-inflight": "^1.0.1",
+            "promise-retry": "^1.1.1",
+            "protoduck": "^5.0.0",
+            "rimraf": "^2.6.2",
+            "safe-buffer": "^5.1.2",
+            "semver": "^5.5.0",
+            "ssri": "^6.0.0",
+            "tar": "^4.4.3",
+            "unique-filename": "^1.1.0",
+            "which": "^1.3.0"
+          }
+        },
+        "parallel-transform": {
+          "version": "1.1.0",
+          "bundled": true,
+          "requires": {
+            "cyclist": "~0.2.2",
+            "inherits": "^2.0.3",
+            "readable-stream": "^2.1.5"
+          }
+        },
+        "path-exists": {
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+          "bundled": true
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "path-is-inside": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "path-key": {
+          "version": "2.0.1",
+          "bundled": true
+        },
+        "performance-now": {
+          "version": "2.1.0",
+          "bundled": true
+        },
+        "pify": {
+          "version": "3.0.0",
+          "bundled": true
+        },
+        "prepend-http": {
+          "version": "1.0.4",
+          "bundled": true
+        },
+        "process-nextick-args": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "promise-inflight": {
+          "version": "1.0.1",
+          "bundled": true
         },
-        "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="
+        "promise-retry": {
+          "version": "1.1.1",
+          "bundled": true,
+          "requires": {
+            "err-code": "^1.0.0",
+            "retry": "^0.10.0"
+          },
+          "dependencies": {
+            "retry": {
+              "version": "0.10.1",
+              "bundled": true
+            }
+          }
         },
-        "string-width": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+        "promzard": {
+          "version": "0.3.0",
+          "bundled": true,
           "requires": {
-            "is-fullwidth-code-point": "2.0.0",
-            "strip-ansi": "4.0.0"
+            "read": "1"
           }
         },
-        "strip-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+        "proto-list": {
+          "version": "1.2.4",
+          "bundled": true
+        },
+        "protoduck": {
+          "version": "5.0.0",
+          "bundled": true,
           "requires": {
-            "ansi-regex": "3.0.0"
+            "genfun": "^4.0.1"
           }
-        }
-      }
-    },
-    "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": {
+        },
+        "prr": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "pseudomap": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "psl": {
+          "version": "1.1.29",
+          "bundled": true
+        },
+        "pump": {
+          "version": "3.0.0",
+          "bundled": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "pumpify": {
+          "version": "1.5.1",
+          "bundled": true,
+          "requires": {
+            "duplexify": "^3.6.0",
+            "inherits": "^2.0.3",
+            "pump": "^2.0.0"
+          },
+          "dependencies": {
+            "pump": {
+              "version": "2.0.1",
+              "bundled": true,
+              "requires": {
+                "end-of-stream": "^1.1.0",
+                "once": "^1.3.1"
+              }
+            }
+          }
+        },
+        "punycode": {
+          "version": "1.4.1",
+          "bundled": true
+        },
+        "qrcode-terminal": {
+          "version": "0.12.0",
+          "bundled": true
+        },
+        "qs": {
+          "version": "6.5.2",
+          "bundled": true
+        },
+        "query-string": {
+          "version": "6.1.0",
+          "bundled": true,
+          "requires": {
+            "decode-uri-component": "^0.2.0",
+            "strict-uri-encode": "^2.0.0"
+          }
+        },
+        "qw": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "rc": {
+          "version": "1.2.7",
+          "bundled": true,
+          "requires": {
+            "deep-extend": "^0.5.1",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "1.2.0",
+              "bundled": true
+            }
+          }
+        },
+        "read": {
+          "version": "1.0.7",
+          "bundled": true,
+          "requires": {
+            "mute-stream": "~0.0.4"
+          }
+        },
+        "read-cmd-shim": {
+          "version": "1.0.1",
+          "bundled": true,
+          "requires": {
+            "graceful-fs": "^4.1.2"
+          }
+        },
+        "read-installed": {
+          "version": "4.0.3",
+          "bundled": true,
+          "requires": {
+            "debuglog": "^1.0.1",
+            "graceful-fs": "^4.1.2",
+            "read-package-json": "^2.0.0",
+            "readdir-scoped-modules": "^1.0.0",
+            "semver": "2 || 3 || 4 || 5",
+            "slide": "~1.1.3",
+            "util-extend": "^1.0.1"
+          }
+        },
+        "read-package-json": {
+          "version": "2.0.13",
+          "bundled": true,
+          "requires": {
+            "glob": "^7.1.1",
+            "graceful-fs": "^4.1.2",
+            "json-parse-better-errors": "^1.0.1",
+            "normalize-package-data": "^2.0.0",
+            "slash": "^1.0.0"
+          }
+        },
+        "read-package-tree": {
+          "version": "5.2.1",
+          "bundled": true,
+          "requires": {
+            "debuglog": "^1.0.1",
+            "dezalgo": "^1.0.0",
+            "once": "^1.3.0",
+            "read-package-json": "^2.0.0",
+            "readdir-scoped-modules": "^1.0.0"
+          }
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "bundled": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "readdir-scoped-modules": {
+          "version": "1.0.2",
+          "bundled": true,
+          "requires": {
+            "debuglog": "^1.0.1",
+            "dezalgo": "^1.0.0",
+            "graceful-fs": "^4.1.2",
+            "once": "^1.3.0"
+          }
+        },
+        "registry-auth-token": {
+          "version": "3.3.2",
+          "bundled": true,
+          "requires": {
+            "rc": "^1.1.6",
+            "safe-buffer": "^5.0.1"
+          }
+        },
+        "registry-url": {
+          "version": "3.1.0",
+          "bundled": true,
+          "requires": {
+            "rc": "^1.0.1"
+          }
+        },
+        "request": {
+          "version": "2.88.0",
+          "bundled": true,
+          "requires": {
+            "aws-sign2": "~0.7.0",
+            "aws4": "^1.8.0",
+            "caseless": "~0.12.0",
+            "combined-stream": "~1.0.6",
+            "extend": "~3.0.2",
+            "forever-agent": "~0.6.1",
+            "form-data": "~2.3.2",
+            "har-validator": "~5.1.0",
+            "http-signature": "~1.2.0",
+            "is-typedarray": "~1.0.0",
+            "isstream": "~0.1.2",
+            "json-stringify-safe": "~5.0.1",
+            "mime-types": "~2.1.19",
+            "oauth-sign": "~0.9.0",
+            "performance-now": "^2.1.0",
+            "qs": "~6.5.2",
+            "safe-buffer": "^5.1.2",
+            "tough-cookie": "~2.4.3",
+            "tunnel-agent": "^0.6.0",
+            "uuid": "^3.3.2"
+          }
+        },
+        "require-directory": {
+          "version": "2.1.1",
+          "bundled": true
+        },
+        "require-main-filename": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "resolve-from": {
           "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
+          "bundled": true
+        },
+        "retry": {
+          "version": "0.12.0",
+          "bundled": true
+        },
+        "rimraf": {
+          "version": "2.6.2",
+          "bundled": true,
+          "requires": {
+            "glob": "^7.0.5"
+          }
+        },
+        "run-queue": {
+          "version": "1.0.3",
+          "bundled": true,
+          "requires": {
+            "aproba": "^1.1.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "bundled": true
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "bundled": true
+        },
+        "semver": {
+          "version": "5.5.0",
+          "bundled": true
+        },
+        "semver-diff": {
+          "version": "2.1.0",
+          "bundled": true,
+          "requires": {
+            "semver": "^5.0.3"
+          }
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "sha": {
+          "version": "2.0.1",
+          "bundled": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "readable-stream": "^2.0.2"
+          }
+        },
+        "shebang-command": {
+          "version": "1.2.0",
+          "bundled": true,
+          "requires": {
+            "shebang-regex": "^1.0.0"
+          }
         },
-        "async": {
-          "version": "1.5.2",
-          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
-          "dev": true
+        "shebang-regex": {
+          "version": "1.0.0",
+          "bundled": true
         },
-        "escodegen": {
-          "version": "1.8.1",
-          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
-          "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
-          "dev": true,
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true
+        },
+        "slash": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "slide": {
+          "version": "1.1.6",
+          "bundled": true
+        },
+        "smart-buffer": {
+          "version": "4.0.1",
+          "bundled": true
+        },
+        "socks": {
+          "version": "2.2.0",
+          "bundled": true,
           "requires": {
-            "esprima": "2.7.3",
-            "estraverse": "1.9.3",
-            "esutils": "2.0.2",
-            "optionator": "0.8.2",
-            "source-map": "0.2.0"
+            "ip": "^1.1.5",
+            "smart-buffer": "^4.0.1"
           }
         },
-        "esprima": {
-          "version": "2.7.3",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
-          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
-          "dev": true
+        "socks-proxy-agent": {
+          "version": "4.0.1",
+          "bundled": true,
+          "requires": {
+            "agent-base": "~4.2.0",
+            "socks": "~2.2.0"
+          }
         },
-        "estraverse": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
-          "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
-          "dev": true
+        "sorted-object": {
+          "version": "2.0.1",
+          "bundled": true
         },
-        "glob": {
-          "version": "5.0.15",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
-          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
-          "dev": true,
+        "sorted-union-stream": {
+          "version": "2.1.3",
+          "bundled": true,
           "requires": {
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
+            "from2": "^1.3.0",
+            "stream-iterate": "^1.1.0"
+          },
+          "dependencies": {
+            "from2": {
+              "version": "1.3.0",
+              "bundled": true,
+              "requires": {
+                "inherits": "~2.0.1",
+                "readable-stream": "~1.1.10"
+              }
+            },
+            "isarray": {
+              "version": "0.0.1",
+              "bundled": true
+            },
+            "readable-stream": {
+              "version": "1.1.14",
+              "bundled": true,
+              "requires": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.1",
+                "isarray": "0.0.1",
+                "string_decoder": "~0.10.x"
+              }
+            },
+            "string_decoder": {
+              "version": "0.10.31",
+              "bundled": true
+            }
           }
         },
-        "has-flag": {
+        "spdx-correct": {
+          "version": "3.0.0",
+          "bundled": true,
+          "requires": {
+            "spdx-expression-parse": "^3.0.0",
+            "spdx-license-ids": "^3.0.0"
+          }
+        },
+        "spdx-exceptions": {
+          "version": "2.1.0",
+          "bundled": true
+        },
+        "spdx-expression-parse": {
+          "version": "3.0.0",
+          "bundled": true,
+          "requires": {
+            "spdx-exceptions": "^2.1.0",
+            "spdx-license-ids": "^3.0.0"
+          }
+        },
+        "spdx-license-ids": {
+          "version": "3.0.0",
+          "bundled": true
+        },
+        "sshpk": {
+          "version": "1.14.2",
+          "bundled": true,
+          "requires": {
+            "asn1": "~0.2.3",
+            "assert-plus": "^1.0.0",
+            "bcrypt-pbkdf": "^1.0.0",
+            "dashdash": "^1.12.0",
+            "ecc-jsbn": "~0.1.1",
+            "getpass": "^0.1.1",
+            "jsbn": "~0.1.0",
+            "safer-buffer": "^2.0.2",
+            "tweetnacl": "~0.14.0"
+          }
+        },
+        "ssri": {
+          "version": "6.0.0",
+          "bundled": true
+        },
+        "stream-each": {
+          "version": "1.2.2",
+          "bundled": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "stream-shift": "^1.0.0"
+          }
+        },
+        "stream-iterate": {
+          "version": "1.2.0",
+          "bundled": true,
+          "requires": {
+            "readable-stream": "^2.1.5",
+            "stream-shift": "^1.0.0"
+          }
+        },
+        "stream-shift": {
           "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
-          "dev": true
+          "bundled": true
         },
-        "nopt": {
-          "version": "3.0.6",
-          "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
-          "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
-          "dev": true,
+        "strict-uri-encode": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "bundled": true,
           "requires": {
-            "abbrev": "1.0.9"
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "3.0.0",
+              "bundled": true
+            },
+            "is-fullwidth-code-point": {
+              "version": "2.0.0",
+              "bundled": true
+            },
+            "strip-ansi": {
+              "version": "4.0.0",
+              "bundled": true,
+              "requires": {
+                "ansi-regex": "^3.0.0"
+              }
+            }
           }
         },
-        "resolve": {
-          "version": "1.1.7",
-          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
-          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
-          "dev": true
+        "string_decoder": {
+          "version": "1.1.1",
+          "bundled": true,
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
         },
-        "source-map": {
+        "stringify-package": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "strip-eof": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true
+        },
+        "supports-color": {
+          "version": "5.4.0",
+          "bundled": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        },
+        "tar": {
+          "version": "4.4.6",
+          "bundled": true,
+          "requires": {
+            "chownr": "^1.0.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.3.3",
+            "minizlib": "^1.1.0",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.2"
+          },
+          "dependencies": {
+            "yallist": {
+              "version": "3.0.2",
+              "bundled": true
+            }
+          }
+        },
+        "term-size": {
+          "version": "1.2.0",
+          "bundled": true,
+          "requires": {
+            "execa": "^0.7.0"
+          }
+        },
+        "text-table": {
           "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,
+          "bundled": true
+        },
+        "through": {
+          "version": "2.3.8",
+          "bundled": true
+        },
+        "through2": {
+          "version": "2.0.3",
+          "bundled": true,
+          "requires": {
+            "readable-stream": "^2.1.5",
+            "xtend": "~4.0.1"
+          }
+        },
+        "timed-out": {
+          "version": "4.0.1",
+          "bundled": true
+        },
+        "tiny-relative-date": {
+          "version": "1.3.0",
+          "bundled": true
+        },
+        "tough-cookie": {
+          "version": "2.4.3",
+          "bundled": true,
+          "requires": {
+            "psl": "^1.1.24",
+            "punycode": "^1.4.1"
+          }
+        },
+        "tunnel-agent": {
+          "version": "0.6.0",
+          "bundled": true,
+          "requires": {
+            "safe-buffer": "^5.0.1"
+          }
+        },
+        "tweetnacl": {
+          "version": "0.14.5",
+          "bundled": true,
+          "optional": true
+        },
+        "typedarray": {
+          "version": "0.0.6",
+          "bundled": true
+        },
+        "uid-number": {
+          "version": "0.0.6",
+          "bundled": true
+        },
+        "umask": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "unique-filename": {
+          "version": "1.1.0",
+          "bundled": true,
+          "requires": {
+            "unique-slug": "^2.0.0"
+          }
+        },
+        "unique-slug": {
+          "version": "2.0.0",
+          "bundled": true,
+          "requires": {
+            "imurmurhash": "^0.1.4"
+          }
+        },
+        "unique-string": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "crypto-random-string": "^1.0.0"
+          }
+        },
+        "unpipe": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "unzip-response": {
+          "version": "2.0.1",
+          "bundled": true
+        },
+        "update-notifier": {
+          "version": "2.5.0",
+          "bundled": true,
+          "requires": {
+            "boxen": "^1.2.1",
+            "chalk": "^2.0.1",
+            "configstore": "^3.0.0",
+            "import-lazy": "^2.1.0",
+            "is-ci": "^1.0.10",
+            "is-installed-globally": "^0.1.0",
+            "is-npm": "^1.0.0",
+            "latest-version": "^3.0.0",
+            "semver-diff": "^2.0.0",
+            "xdg-basedir": "^3.0.0"
+          }
+        },
+        "url-parse-lax": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "prepend-http": "^1.0.1"
+          }
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "util-extend": {
+          "version": "1.0.3",
+          "bundled": true
+        },
+        "uuid": {
+          "version": "3.3.2",
+          "bundled": true
+        },
+        "validate-npm-package-license": {
+          "version": "3.0.4",
+          "bundled": true,
           "requires": {
-            "amdefine": "1.0.1"
+            "spdx-correct": "^3.0.0",
+            "spdx-expression-parse": "^3.0.0"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
-          "dev": true,
+        "validate-npm-package-name": {
+          "version": "3.0.0",
+          "bundled": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "builtins": "^1.0.3"
           }
         },
-        "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,
+        "verror": {
+          "version": "1.10.0",
+          "bundled": 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"
+            "assert-plus": "^1.0.0",
+            "core-util-is": "1.0.2",
+            "extsprintf": "^1.2.0"
           }
         },
-        "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,
+        "wcwidth": {
+          "version": "1.0.1",
+          "bundled": true,
           "requires": {
-            "ajv": "5.5.2"
+            "defaults": "^1.0.3"
           }
-        }
-      }
-    },
-    "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,
+        "which": {
+          "version": "1.3.1",
+          "bundled": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "isexe": "^2.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,
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "wide-align": {
+          "version": "1.1.2",
+          "bundled": true,
           "requires": {
-            "ms": "2.0.0"
+            "string-width": "^1.0.2"
+          },
+          "dependencies": {
+            "string-width": {
+              "version": "1.0.2",
+              "bundled": true,
+              "requires": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+              }
+            }
+          }
+        },
+        "widest-line": {
+          "version": "2.0.0",
+          "bundled": true,
+          "requires": {
+            "string-width": "^2.1.1"
+          }
+        },
+        "worker-farm": {
+          "version": "1.6.0",
+          "bundled": true,
+          "requires": {
+            "errno": "~0.1.7"
           }
-        }
-      }
-    },
-    "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
+        "wrap-ansi": {
+          "version": "2.1.0",
+          "bundled": true,
+          "requires": {
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1"
+          },
+          "dependencies": {
+            "string-width": {
+              "version": "1.0.2",
+              "bundled": true,
+              "requires": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+              }
+            }
+          }
         },
-        "useragent": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz",
-          "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=",
-          "dev": true,
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "write-file-atomic": {
+          "version": "2.3.0",
+          "bundled": true,
           "requires": {
-            "lru-cache": "2.2.4",
-            "tmp": "0.0.33"
+            "graceful-fs": "^4.1.11",
+            "imurmurhash": "^0.1.4",
+            "signal-exit": "^3.0.2"
           }
-        }
-      }
-    },
-    "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,
+        "xdg-basedir": {
+          "version": "3.0.0",
+          "bundled": true
+        },
+        "xtend": {
+          "version": "4.0.1",
+          "bundled": true
+        },
+        "y18n": {
+          "version": "4.0.0",
+          "bundled": true
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "bundled": true
+        },
+        "yargs": {
+          "version": "11.0.0",
+          "bundled": 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"
+            "cliui": "^4.0.0",
+            "decamelize": "^1.1.1",
+            "find-up": "^2.1.0",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^2.0.0",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^2.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^3.2.1",
+            "yargs-parser": "^9.0.2"
+          },
+          "dependencies": {
+            "y18n": {
+              "version": "3.2.1",
+              "bundled": 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
-        }
-      }
-    },
-    "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
+        "yargs-parser": {
+          "version": "9.0.2",
+          "bundled": true,
+          "requires": {
+            "camelcase": "^4.1.0"
+          }
         }
       }
     },
-    "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=",
+    "npm-bundled": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz",
+      "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==",
       "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,
+    "npm-name": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/npm-name/-/npm-name-3.0.0.tgz",
+      "integrity": "sha1-9y5AR5k6C/kyp9jbeAur/3e6cj8=",
       "requires": {
-        "prelude-ls": "1.1.2",
-        "type-check": "0.3.2"
+        "got": "^6.3.0",
+        "lodash.zip": "^4.0.0",
+        "registry-url": "^3.0.0"
       }
     },
-    "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=",
+    "npm-package-arg": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz",
+      "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==",
       "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
-        }
+        "hosted-git-info": "^2.6.0",
+        "osenv": "^0.1.5",
+        "semver": "^5.5.0",
+        "validate-npm-package-name": "^3.0.0"
       }
     },
-    "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==",
+    "npm-packlist": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.12.tgz",
+      "integrity": "sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g==",
       "dev": true,
       "requires": {
-        "ejs": "2.5.7"
+        "ignore-walk": "^3.0.1",
+        "npm-bundled": "^1.0.1"
       }
     },
-    "listr": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz",
-      "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=",
+    "npm-pick-manifest": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz",
+      "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==",
       "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
-        }
+        "figgy-pudding": "^3.5.1",
+        "npm-package-arg": "^6.0.0",
+        "semver": "^5.4.1"
       }
     },
-    "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=",
+    "npm-registry-fetch": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz",
+      "integrity": "sha512-hrw8UMD+Nob3Kl3h8Z/YjmKamb1gf7D1ZZch2otrIXM3uFLB5vjEY6DhMlq80z/zZet6eETLbOXcuQudCB3Zpw==",
       "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"
+        "JSONStream": "^1.3.4",
+        "bluebird": "^3.5.1",
+        "figgy-pudding": "^3.4.1",
+        "lru-cache": "^4.1.3",
+        "make-fetch-happen": "^4.0.1",
+        "npm-package-arg": "^6.1.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"
-          }
-        },
-        "figures": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
-          "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+      "dependencies": {
+        "lru-cache": {
+          "version": "4.1.5",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+          "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
           "dev": true,
           "requires": {
-            "escape-string-regexp": "1.0.5",
-            "object-assign": "4.1.1"
+            "pseudomap": "^1.0.2",
+            "yallist": "^2.1.2"
           }
-        },
-        "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=",
+    "npm-run-all": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
+      "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
       "dev": true,
       "requires": {
-        "chalk": "1.1.3",
-        "cli-cursor": "1.0.2",
-        "date-fns": "1.29.0",
-        "figures": "1.7.0"
+        "ansi-styles": "^3.2.1",
+        "chalk": "^2.4.1",
+        "cross-spawn": "^6.0.5",
+        "memorystream": "^0.3.1",
+        "minimatch": "^3.0.4",
+        "pidtree": "^0.3.0",
+        "read-pkg": "^3.0.0",
+        "shell-quote": "^1.6.1",
+        "string.prototype.padend": "^3.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=",
-          "dev": true
-        },
         "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
           "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"
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
           }
         },
-        "cli-cursor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
-          "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
           "dev": true,
           "requires": {
-            "restore-cursor": "1.0.1"
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
           }
         },
-        "figures": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
-          "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "load-json-file": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+          "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
           "dev": true,
           "requires": {
-            "escape-string-regexp": "1.0.5",
-            "object-assign": "4.1.1"
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^4.0.0",
+            "pify": "^3.0.0",
+            "strip-bom": "^3.0.0"
           }
         },
-        "onetime": {
-          "version": "1.1.0",
-          "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
-          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
-          "dev": true
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
         },
-        "restore-cursor": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
-          "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+        "read-pkg": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+          "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
           "dev": true,
           "requires": {
-            "exit-hook": "1.1.1",
-            "onetime": "1.1.0"
+            "load-json-file": "^4.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^3.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=",
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
           "dev": true
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "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=",
+    "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=",
       "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"
+        "path-key": "^2.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=",
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
       "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"
+        "are-we-there-yet": "~1.1.2",
+        "console-control-strings": "~1.1.0",
+        "gauge": "~2.7.3",
+        "set-blocking": "~2.0.0"
       }
     },
-    "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=",
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
       "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="
+    "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="
     },
-    "lodash.tail": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
-      "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=",
+    "nwsapi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.0.tgz",
+      "integrity": "sha512-ZG3bLAvdHmhIjaQ/Db1qvBxsGvFMLIRpQszyqbg31VJ53UP++uZX1/gf3Ut96pdwN9AuDwlMqIYLm0UPCdUeHg==",
       "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"
+    "nyc": {
+      "version": "12.0.2",
+      "resolved": "https://registry.npmjs.org/nyc/-/nyc-12.0.2.tgz",
+      "integrity": "sha1-ikpO1pCWbBHsWH/4fuoMEsl0upk=",
+      "requires": {
+        "archy": "^1.0.0",
+        "arrify": "^1.0.1",
+        "caching-transform": "^1.0.0",
+        "convert-source-map": "^1.5.1",
+        "debug-log": "^1.0.1",
+        "default-require-extensions": "^1.0.0",
+        "find-cache-dir": "^0.1.1",
+        "find-up": "^2.1.0",
+        "foreground-child": "^1.5.3",
+        "glob": "^7.0.6",
+        "istanbul-lib-coverage": "^1.2.0",
+        "istanbul-lib-hook": "^1.1.0",
+        "istanbul-lib-instrument": "^2.1.0",
+        "istanbul-lib-report": "^1.1.3",
+        "istanbul-lib-source-maps": "^1.2.5",
+        "istanbul-reports": "^1.4.1",
+        "md5-hex": "^1.2.0",
+        "merge-source-map": "^1.1.0",
+        "micromatch": "^3.1.10",
+        "mkdirp": "^0.5.0",
+        "resolve-from": "^2.0.0",
+        "rimraf": "^2.6.2",
+        "signal-exit": "^3.0.1",
+        "spawn-wrap": "^1.4.2",
+        "test-exclude": "^4.2.0",
+        "yargs": "11.1.0",
+        "yargs-parser": "^8.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=",
-          "dev": true
+        "align-text": {
+          "version": "0.1.4",
+          "bundled": true,
+          "requires": {
+            "kind-of": "^3.0.2",
+            "longest": "^1.0.1",
+            "repeat-string": "^1.5.2"
+          }
+        },
+        "amdefine": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "ansi-regex": {
+          "version": "3.0.0",
+          "bundled": true
+        },
+        "append-transform": {
+          "version": "0.4.0",
+          "bundled": true,
+          "requires": {
+            "default-require-extensions": "^1.0.0"
+          }
+        },
+        "archy": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "arr-diff": {
+          "version": "4.0.0",
+          "bundled": true
+        },
+        "arr-flatten": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "arr-union": {
+          "version": "3.1.0",
+          "bundled": true
         },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
+        "array-unique": {
+          "version": "0.3.2",
+          "bundled": true
+        },
+        "arrify": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "assign-symbols": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "async": {
+          "version": "1.5.2",
+          "bundled": true
+        },
+        "atob": {
+          "version": "2.1.1",
+          "bundled": true
+        },
+        "balanced-match": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "base": {
+          "version": "0.11.2",
+          "bundled": 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"
+            "cache-base": "^1.0.1",
+            "class-utils": "^0.3.5",
+            "component-emitter": "^1.2.1",
+            "define-property": "^1.0.0",
+            "isobject": "^3.0.1",
+            "mixin-deep": "^1.2.0",
+            "pascalcase": "^0.1.1"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "kind-of": "^6.0.0"
+              }
+            },
+            "is-data-descriptor": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "kind-of": "^6.0.0"
+              }
+            },
+            "is-descriptor": {
+              "version": "1.0.2",
+              "bundled": true,
+              "requires": {
+                "is-accessor-descriptor": "^1.0.0",
+                "is-data-descriptor": "^1.0.0",
+                "kind-of": "^6.0.2"
+              }
+            },
+            "kind-of": {
+              "version": "6.0.2",
+              "bundled": 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
-        }
-      }
-    },
-    "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
+        "brace-expansion": {
+          "version": "1.1.11",
+          "bundled": true,
+          "requires": {
+            "balanced-match": "^1.0.0",
+            "concat-map": "0.0.1"
+          }
         },
-        "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,
+        "braces": {
+          "version": "2.3.2",
+          "bundled": true,
           "requires": {
-            "restore-cursor": "1.0.1"
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "bundled": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
           }
         },
-        "onetime": {
+        "builtin-modules": {
+          "version": "1.1.1",
+          "bundled": true
+        },
+        "cache-base": {
+          "version": "1.0.1",
+          "bundled": true,
+          "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"
+          }
+        },
+        "caching-transform": {
+          "version": "1.0.1",
+          "bundled": true,
+          "requires": {
+            "md5-hex": "^1.2.0",
+            "mkdirp": "^0.5.1",
+            "write-file-atomic": "^1.1.4"
+          }
+        },
+        "camelcase": {
+          "version": "1.2.1",
+          "bundled": true,
+          "optional": true
+        },
+        "center-align": {
+          "version": "0.1.3",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "align-text": "^0.1.3",
+            "lazy-cache": "^1.0.3"
+          }
+        },
+        "class-utils": {
+          "version": "0.3.6",
+          "bundled": true,
+          "requires": {
+            "arr-union": "^3.1.0",
+            "define-property": "^0.2.5",
+            "isobject": "^3.0.0",
+            "static-extend": "^0.1.1"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "0.2.5",
+              "bundled": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            }
+          }
+        },
+        "cliui": {
+          "version": "2.1.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "center-align": "^0.1.1",
+            "right-align": "^0.1.1",
+            "wordwrap": "0.0.2"
+          },
+          "dependencies": {
+            "wordwrap": {
+              "version": "0.0.2",
+              "bundled": true,
+              "optional": true
+            }
+          }
+        },
+        "code-point-at": {
           "version": "1.1.0",
-          "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
-          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
-          "dev": true
+          "bundled": true
         },
-        "restore-cursor": {
+        "collection-visit": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "map-visit": "^1.0.0",
+            "object-visit": "^1.0.0"
+          }
+        },
+        "commondir": {
           "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
-          "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
-          "dev": true,
+          "bundled": true
+        },
+        "component-emitter": {
+          "version": "1.2.1",
+          "bundled": true
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true
+        },
+        "convert-source-map": {
+          "version": "1.5.1",
+          "bundled": true
+        },
+        "copy-descriptor": {
+          "version": "0.1.1",
+          "bundled": true
+        },
+        "cross-spawn": {
+          "version": "4.0.2",
+          "bundled": true,
           "requires": {
-            "exit-hook": "1.1.1",
-            "onetime": "1.1.0"
+            "lru-cache": "^4.0.1",
+            "which": "^1.2.9"
           }
-        }
-      }
-    },
-    "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,
+          "bundled": 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
+        "debug-log": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "decamelize": {
+          "version": "1.2.0",
+          "bundled": true
+        },
+        "decode-uri-component": {
+          "version": "0.2.0",
+          "bundled": true
+        },
+        "default-require-extensions": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "strip-bom": "^2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "2.0.2",
+          "bundled": true,
+          "requires": {
+            "is-descriptor": "^1.0.2",
+            "isobject": "^3.0.1"
+          },
+          "dependencies": {
+            "is-accessor-descriptor": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "kind-of": "^6.0.0"
+              }
+            },
+            "is-data-descriptor": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "kind-of": "^6.0.0"
+              }
+            },
+            "is-descriptor": {
+              "version": "1.0.2",
+              "bundled": true,
+              "requires": {
+                "is-accessor-descriptor": "^1.0.0",
+                "is-data-descriptor": "^1.0.0",
+                "kind-of": "^6.0.2"
+              }
+            },
+            "kind-of": {
+              "version": "6.0.2",
+              "bundled": true
+            }
+          }
+        },
+        "error-ex": {
+          "version": "1.3.1",
+          "bundled": true,
+          "requires": {
+            "is-arrayish": "^0.2.1"
+          }
+        },
+        "execa": {
+          "version": "0.7.0",
+          "bundled": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          },
+          "dependencies": {
+            "cross-spawn": {
+              "version": "5.1.0",
+              "bundled": true,
+              "requires": {
+                "lru-cache": "^4.0.1",
+                "shebang-command": "^1.2.0",
+                "which": "^1.2.9"
+              }
+            }
+          }
         },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "optional": true,
+        "expand-brackets": {
+          "version": "2.1.4",
+          "bundled": 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"
+            "debug": "^2.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "2.6.9",
+              "bundled": true,
+              "requires": {
+                "ms": "2.0.0"
+              }
+            },
+            "define-property": {
+              "version": "0.2.5",
+              "bundled": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "bundled": true,
+              "requires": {
+                "is-extendable": "^0.1.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,
+        "extend-shallow": {
+          "version": "3.0.2",
+          "bundled": true,
           "requires": {
-            "asynckit": "0.4.0",
-            "combined-stream": "1.0.6",
-            "mime-types": "2.1.18"
+            "assign-symbols": "^1.0.0",
+            "is-extendable": "^1.0.1"
+          },
+          "dependencies": {
+            "is-extendable": {
+              "version": "1.0.1",
+              "bundled": true,
+              "requires": {
+                "is-plain-object": "^2.0.4"
+              }
+            }
           }
         },
-        "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,
+        "extglob": {
+          "version": "2.0.4",
+          "bundled": true,
           "requires": {
-            "chalk": "1.1.3",
-            "commander": "2.15.0",
-            "is-my-json-valid": "2.17.2",
-            "pinkie-promise": "2.0.1"
+            "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "bundled": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "kind-of": "^6.0.0"
+              }
+            },
+            "is-data-descriptor": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "kind-of": "^6.0.0"
+              }
+            },
+            "is-descriptor": {
+              "version": "1.0.2",
+              "bundled": true,
+              "requires": {
+                "is-accessor-descriptor": "^1.0.0",
+                "is-data-descriptor": "^1.0.0",
+                "kind-of": "^6.0.2"
+              }
+            },
+            "kind-of": {
+              "version": "6.0.2",
+              "bundled": true
+            }
           }
         },
-        "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
+        "fill-range": {
+          "version": "4.0.0",
+          "bundled": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "bundled": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
         },
-        "qs": {
-          "version": "6.2.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz",
-          "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=",
-          "dev": true,
-          "optional": true
+        "find-cache-dir": {
+          "version": "0.1.1",
+          "bundled": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "mkdirp": "^0.5.1",
+            "pkg-dir": "^1.0.0"
+          }
         },
-        "request": {
-          "version": "2.75.0",
-          "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz",
-          "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=",
-          "dev": true,
-          "optional": true,
+        "find-up": {
+          "version": "2.1.0",
+          "bundled": 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"
+            "locate-path": "^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,
-          "optional": true
+        "for-in": {
+          "version": "1.0.2",
+          "bundled": 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,
+        "foreground-child": {
+          "version": "1.5.6",
+          "bundled": true,
           "requires": {
-            "lodash": "4.17.5"
+            "cross-spawn": "^4",
+            "signal-exit": "^3.0.0"
           }
         },
-        "debug": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
-          "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
-          "dev": true,
-          "optional": true,
+        "fragment-cache": {
+          "version": "0.2.1",
+          "bundled": true,
           "requires": {
-            "ms": "0.7.1"
+            "map-cache": "^0.2.2"
           }
         },
-        "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=",
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "get-caller-file": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "bundled": true
+        },
+        "get-value": {
+          "version": "2.0.6",
+          "bundled": true
+        },
+        "glob": {
+          "version": "7.1.2",
+          "bundled": true,
           "requires": {
-            "inherits": "2.0.3",
-            "safe-buffer": "5.1.1"
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
-        }
-      }
-    },
-    "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==",
+        },
+        "graceful-fs": {
+          "version": "4.1.11",
+          "bundled": true
+        },
+        "handlebars": {
+          "version": "4.0.11",
+          "bundled": true,
           "requires": {
-            "is-plain-object": "2.0.4"
+            "async": "^1.4.0",
+            "optimist": "^0.6.1",
+            "source-map": "^0.4.4",
+            "uglify-js": "^2.6"
+          },
+          "dependencies": {
+            "source-map": {
+              "version": "0.4.4",
+              "bundled": true,
+              "requires": {
+                "amdefine": ">=0.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,
+        },
+        "has-value": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "get-value": "^2.0.6",
+            "has-values": "^1.0.0",
+            "isobject": "^3.0.0"
+          }
+        },
+        "has-values": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "kind-of": "^4.0.0"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "4.0.0",
+              "bundled": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "hosted-git-info": {
+          "version": "2.6.0",
+          "bundled": true
+        },
+        "imurmurhash": {
+          "version": "0.1.4",
+          "bundled": true
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "requires": {
+            "once": "^1.3.0",
+            "wrappy": "1"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true
+        },
+        "invert-kv": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "bundled": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        },
+        "is-arrayish": {
+          "version": "0.2.1",
+          "bundled": true
+        },
+        "is-buffer": {
+          "version": "1.1.6",
+          "bundled": true
+        },
+        "is-builtin-module": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "builtin-modules": "^1.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "bundled": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "bundled": true,
+          "requires": {
+            "is-accessor-descriptor": "^0.1.6",
+            "is-data-descriptor": "^0.1.4",
+            "kind-of": "^5.0.0"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "5.1.0",
+              "bundled": true
+            }
+          }
+        },
+        "is-extendable": {
+          "version": "0.1.1",
+          "bundled": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "bundled": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        },
+        "is-odd": {
+          "version": "2.0.0",
+          "bundled": true,
+          "requires": {
+            "is-number": "^4.0.0"
+          },
+          "dependencies": {
+            "is-number": {
+              "version": "4.0.0",
+              "bundled": true
+            }
+          }
+        },
+        "is-plain-object": {
+          "version": "2.0.4",
+          "bundled": true,
           "requires": {
-            "readable-stream": "1.1.14"
+            "isobject": "^3.0.1"
           }
         },
+        "is-stream": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "is-utf8": {
+          "version": "0.2.1",
+          "bundled": true
+        },
+        "is-windows": {
+          "version": "1.0.2",
+          "bundled": true
+        },
         "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
+          "version": "1.0.0",
+          "bundled": 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,
+        "isexe": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "bundled": true
+        },
+        "istanbul-lib-coverage": {
+          "version": "1.2.0",
+          "bundled": true
+        },
+        "istanbul-lib-hook": {
+          "version": "1.1.0",
+          "bundled": true,
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "0.0.1",
-            "string_decoder": "0.10.31"
+            "append-transform": "^0.4.0"
           }
         },
-        "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="
+        "istanbul-lib-instrument": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-2.3.2.tgz",
+          "integrity": "sha512-l7TD/VnBsIB2OJvSyxaLW/ab1+92dxZNH9wLH7uHPPioy3JZ8tnx2UXUdKmdkgmP2EFPzg64CToUP6dAS3U32Q==",
+          "requires": {
+            "@babel/generator": "7.0.0-beta.51",
+            "@babel/parser": "7.0.0-beta.51",
+            "@babel/template": "7.0.0-beta.51",
+            "@babel/traverse": "7.0.0-beta.51",
+            "@babel/types": "7.0.0-beta.51",
+            "istanbul-lib-coverage": "^2.0.1",
+            "semver": "^5.5.0"
+          },
+          "dependencies": {
+            "istanbul-lib-coverage": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz",
+              "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA=="
+            }
+          }
         },
-        "array-unique": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+        "istanbul-lib-report": {
+          "version": "1.1.3",
+          "bundled": true,
+          "requires": {
+            "istanbul-lib-coverage": "^1.1.2",
+            "mkdirp": "^0.5.1",
+            "path-parse": "^1.0.5",
+            "supports-color": "^3.1.2"
+          },
+          "dependencies": {
+            "has-flag": {
+              "version": "1.0.0",
+              "bundled": true
+            },
+            "supports-color": {
+              "version": "3.2.3",
+              "bundled": true,
+              "requires": {
+                "has-flag": "^1.0.0"
+              }
+            }
+          }
+        },
+        "istanbul-lib-source-maps": {
+          "version": "1.2.5",
+          "bundled": true,
+          "requires": {
+            "debug": "^3.1.0",
+            "istanbul-lib-coverage": "^1.2.0",
+            "mkdirp": "^0.5.1",
+            "rimraf": "^2.6.1",
+            "source-map": "^0.5.3"
+          }
+        },
+        "istanbul-reports": {
+          "version": "1.4.1",
+          "bundled": true,
+          "requires": {
+            "handlebars": "^4.0.3"
+          }
         },
         "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,
+          "version": "3.2.2",
+          "bundled": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        },
+        "lazy-cache": {
+          "version": "1.0.4",
+          "bundled": true,
+          "optional": true
+        },
+        "lcid": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "invert-kv": "^1.0.0"
+          }
+        },
+        "load-json-file": {
+          "version": "1.1.0",
+          "bundled": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^2.2.0",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0",
+            "strip-bom": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "bundled": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          },
+          "dependencies": {
+            "path-exists": {
+              "version": "3.0.0",
+              "bundled": true
+            }
+          }
+        },
+        "longest": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "lru-cache": {
+          "version": "4.1.3",
+          "bundled": true,
           "requires": {
-            "abbrev": "1.1.1"
+            "pseudomap": "^1.0.2",
+            "yallist": "^2.1.2"
           }
         },
-        "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
+        "map-cache": {
+          "version": "0.2.2",
+          "bundled": true
         },
-        "caseless": {
-          "version": "0.11.0",
-          "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
-          "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
-          "dev": true,
-          "optional": true
+        "map-visit": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "object-visit": "^1.0.0"
+          }
         },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
+        "md5-hex": {
+          "version": "1.3.0",
+          "bundled": 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"
+            "md5-o-matic": "^0.1.1"
           }
         },
-        "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,
+        "md5-o-matic": {
+          "version": "0.1.1",
+          "bundled": true
+        },
+        "mem": {
+          "version": "1.1.0",
+          "bundled": true,
           "requires": {
-            "chalk": "1.1.3",
-            "commander": "2.15.0",
-            "is-my-json-valid": "2.17.2",
-            "pinkie-promise": "2.0.1"
+            "mimic-fn": "^1.0.0"
           }
         },
-        "qs": {
-          "version": "6.3.2",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
-          "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
-          "dev": true,
-          "optional": true
+        "merge-source-map": {
+          "version": "1.1.0",
+          "bundled": true,
+          "requires": {
+            "source-map": "^0.6.1"
+          },
+          "dependencies": {
+            "source-map": {
+              "version": "0.6.1",
+              "bundled": 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,
+        "micromatch": {
+          "version": "3.1.10",
+          "bundled": 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"
+            "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "6.0.2",
+              "bundled": 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
+        "mimic-fn": {
+          "version": "1.2.0",
+          "bundled": 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,
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
           "requires": {
-            "ip": "1.1.5",
-            "smart-buffer": "1.1.15"
+            "brace-expansion": "^1.1.7"
           }
-        }
-      }
-    },
-    "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=",
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true
+        },
+        "mixin-deep": {
+          "version": "1.3.1",
+          "bundled": true,
           "requires": {
-            "is-descriptor": "0.1.6"
+            "for-in": "^1.0.2",
+            "is-extendable": "^1.0.1"
+          },
+          "dependencies": {
+            "is-extendable": {
+              "version": "1.0.1",
+              "bundled": true,
+              "requires": {
+                "is-plain-object": "^2.0.4"
+              }
+            }
           }
         },
-        "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=",
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "nanomatch": {
+          "version": "1.2.9",
+          "bundled": true,
+          "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "6.0.2",
+              "bundled": true
+            }
+          }
+        },
+        "normalize-package-data": {
+          "version": "2.4.0",
+          "bundled": true,
           "requires": {
-            "kind-of": "3.2.2"
+            "hosted-git-info": "^2.1.4",
+            "is-builtin-module": "^1.0.0",
+            "semver": "2 || 3 || 4 || 5",
+            "validate-npm-package-license": "^3.0.1"
           }
         },
-        "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=",
+        "npm-run-path": {
+          "version": "2.0.2",
+          "bundled": true,
           "requires": {
-            "kind-of": "3.2.2"
+            "path-key": "^2.0.0"
           }
         },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true
+        },
+        "object-copy": {
+          "version": "0.1.0",
+          "bundled": true,
           "requires": {
-            "is-accessor-descriptor": "0.1.6",
-            "is-data-descriptor": "0.1.4",
-            "kind-of": "5.1.0"
+            "copy-descriptor": "^0.1.0",
+            "define-property": "^0.2.5",
+            "kind-of": "^3.0.3"
           },
           "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=="
+            "define-property": {
+              "version": "0.2.5",
+              "bundled": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
             }
           }
-        }
-      }
-    },
-    "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,
+        "object-visit": {
+          "version": "1.0.1",
+          "bundled": 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"
+            "isobject": "^3.0.0"
           }
         },
-        "cli-cursor": {
+        "object.pick": {
+          "version": "1.3.0",
+          "bundled": true,
+          "requires": {
+            "isobject": "^3.0.1"
+          }
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "requires": {
+            "wrappy": "1"
+          }
+        },
+        "optimist": {
+          "version": "0.6.1",
+          "bundled": true,
+          "requires": {
+            "minimist": "~0.0.1",
+            "wordwrap": "~0.0.2"
+          }
+        },
+        "os-homedir": {
           "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
-          "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
-          "dev": true,
+          "bundled": true
+        },
+        "os-locale": {
+          "version": "2.1.0",
+          "bundled": true,
           "requires": {
-            "restore-cursor": "1.0.1"
+            "execa": "^0.7.0",
+            "lcid": "^1.0.0",
+            "mem": "^1.1.0"
           }
         },
-        "onetime": {
-          "version": "1.1.0",
-          "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
-          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
-          "dev": true
+        "p-finally": {
+          "version": "1.0.0",
+          "bundled": true
         },
-        "restore-cursor": {
+        "p-limit": {
+          "version": "1.2.0",
+          "bundled": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "bundled": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "parse-json": {
+          "version": "2.2.0",
+          "bundled": true,
+          "requires": {
+            "error-ex": "^1.2.0"
+          }
+        },
+        "pascalcase": {
+          "version": "0.1.1",
+          "bundled": true
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "bundled": true,
+          "requires": {
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "path-is-absolute": {
           "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
-          "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
-          "dev": true,
+          "bundled": true
+        },
+        "path-key": {
+          "version": "2.0.1",
+          "bundled": true
+        },
+        "path-parse": {
+          "version": "1.0.5",
+          "bundled": true
+        },
+        "path-type": {
+          "version": "1.1.0",
+          "bundled": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "bundled": true
+        },
+        "pinkie": {
+          "version": "2.0.4",
+          "bundled": true
+        },
+        "pinkie-promise": {
+          "version": "2.0.1",
+          "bundled": true,
           "requires": {
-            "exit-hook": "1.1.1",
-            "onetime": "1.1.0"
+            "pinkie": "^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
-        }
-      }
-    },
-    "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=",
+        "pkg-dir": {
+          "version": "1.0.0",
+          "bundled": true,
           "requires": {
-            "querystringify": "0.0.4",
-            "requires-port": "1.0.0"
+            "find-up": "^1.0.0"
+          },
+          "dependencies": {
+            "find-up": {
+              "version": "1.1.2",
+              "bundled": true,
+              "requires": {
+                "path-exists": "^2.0.0",
+                "pinkie-promise": "^2.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,
+        "posix-character-classes": {
+          "version": "0.1.1",
+          "bundled": true
+        },
+        "pseudomap": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "read-pkg": {
+          "version": "1.1.0",
+          "bundled": true,
           "requires": {
-            "graceful-fs": "4.1.11",
-            "jsonfile": "2.4.0",
-            "klaw": "1.3.1"
+            "load-json-file": "^1.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^1.0.0"
           }
         },
-        "jsonfile": {
-          "version": "2.4.0",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
-          "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
-          "dev": true,
+        "read-pkg-up": {
+          "version": "1.0.1",
+          "bundled": true,
           "requires": {
-            "graceful-fs": "4.1.11"
+            "find-up": "^1.0.0",
+            "read-pkg": "^1.0.0"
+          },
+          "dependencies": {
+            "find-up": {
+              "version": "1.1.2",
+              "bundled": true,
+              "requires": {
+                "path-exists": "^2.0.0",
+                "pinkie-promise": "^2.0.0"
+              }
+            }
           }
-        }
-      }
-    },
-    "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==",
+        },
+        "regex-not": {
+          "version": "1.0.2",
+          "bundled": true,
           "requires": {
-            "ansi-styles": "3.2.1",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "5.3.0"
+            "extend-shallow": "^3.0.2",
+            "safe-regex": "^1.1.0"
           }
         },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+        "repeat-element": {
+          "version": "1.1.2",
+          "bundled": true
         },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        "repeat-string": {
+          "version": "1.6.1",
+          "bundled": 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==",
+        "require-directory": {
+          "version": "2.1.1",
+          "bundled": true
+        },
+        "require-main-filename": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "resolve-from": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "resolve-url": {
+          "version": "0.2.1",
+          "bundled": true
+        },
+        "ret": {
+          "version": "0.1.15",
+          "bundled": true
+        },
+        "right-align": {
+          "version": "0.1.3",
+          "bundled": true,
+          "optional": true,
           "requires": {
-            "has-flag": "3.0.0"
+            "align-text": "^0.1.1"
           }
-        }
-      }
-    },
-    "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=",
+        "rimraf": {
+          "version": "2.6.2",
+          "bundled": true,
+          "requires": {
+            "glob": "^7.0.5"
+          }
+        },
+        "safe-regex": {
+          "version": "1.1.0",
+          "bundled": true,
+          "requires": {
+            "ret": "~0.1.10"
+          }
+        },
+        "semver": {
+          "version": "5.5.0",
+          "bundled": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "set-value": {
+          "version": "2.0.0",
+          "bundled": 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"
+            "extend-shallow": "^2.0.1",
+            "is-extendable": "^0.1.1",
+            "is-plain-object": "^2.0.3",
+            "split-string": "^3.0.1"
           },
           "dependencies": {
-            "supports-color": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            "extend-shallow": {
+              "version": "2.0.1",
+              "bundled": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
             }
           }
         },
-        "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==",
+        "shebang-command": {
+          "version": "1.2.0",
+          "bundled": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "shebang-regex": "^1.0.0"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "shebang-regex": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true
+        },
+        "slide": {
+          "version": "1.1.6",
+          "bundled": true
+        },
+        "snapdragon": {
+          "version": "0.8.2",
+          "bundled": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "base": "^0.11.1",
+            "debug": "^2.2.0",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "map-cache": "^0.2.2",
+            "source-map": "^0.5.6",
+            "source-map-resolve": "^0.5.0",
+            "use": "^3.1.0"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "2.6.9",
+              "bundled": true,
+              "requires": {
+                "ms": "2.0.0"
+              }
+            },
+            "define-property": {
+              "version": "0.2.5",
+              "bundled": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "bundled": true,
+              "requires": {
+                "is-extendable": "^0.1.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=",
+        "snapdragon-node": {
+          "version": "2.1.1",
+          "bundled": 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"
+            "define-property": "^1.0.0",
+            "isobject": "^3.0.0",
+            "snapdragon-util": "^3.0.1"
           },
           "dependencies": {
-            "supports-color": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            "define-property": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "kind-of": "^6.0.0"
+              }
+            },
+            "is-data-descriptor": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "kind-of": "^6.0.0"
+              }
+            },
+            "is-descriptor": {
+              "version": "1.0.2",
+              "bundled": true,
+              "requires": {
+                "is-accessor-descriptor": "^1.0.0",
+                "is-data-descriptor": "^1.0.0",
+                "kind-of": "^6.0.2"
+              }
+            },
+            "kind-of": {
+              "version": "6.0.2",
+              "bundled": true
             }
           }
         },
-        "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==",
+        "snapdragon-util": {
+          "version": "3.0.1",
+          "bundled": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "kind-of": "^3.2.0"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "source-map": {
+          "version": "0.5.7",
+          "bundled": true
+        },
+        "source-map-resolve": {
+          "version": "0.5.2",
+          "bundled": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "atob": "^2.1.1",
+            "decode-uri-component": "^0.2.0",
+            "resolve-url": "^0.2.1",
+            "source-map-url": "^0.4.0",
+            "urix": "^0.1.0"
+          }
+        },
+        "source-map-url": {
+          "version": "0.4.0",
+          "bundled": true
+        },
+        "spawn-wrap": {
+          "version": "1.4.2",
+          "bundled": true,
+          "requires": {
+            "foreground-child": "^1.5.6",
+            "mkdirp": "^0.5.0",
+            "os-homedir": "^1.0.1",
+            "rimraf": "^2.6.2",
+            "signal-exit": "^3.0.2",
+            "which": "^1.3.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=",
+        "spdx-correct": {
+          "version": "3.0.0",
+          "bundled": 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"
-          },
-          "dependencies": {
-            "supports-color": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
-            }
+            "spdx-expression-parse": "^3.0.0",
+            "spdx-license-ids": "^3.0.0"
           }
         },
-        "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        "spdx-exceptions": {
+          "version": "2.1.0",
+          "bundled": true
         },
-        "postcss": {
-          "version": "5.2.18",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
-          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+        "spdx-expression-parse": {
+          "version": "3.0.0",
+          "bundled": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "spdx-exceptions": "^2.1.0",
+            "spdx-license-ids": "^3.0.0"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "spdx-license-ids": {
+          "version": "3.0.0",
+          "bundled": true
+        },
+        "split-string": {
+          "version": "3.1.0",
+          "bundled": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "extend-shallow": "^3.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=",
+        "static-extend": {
+          "version": "0.1.2",
+          "bundled": 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"
+            "define-property": "^0.2.5",
+            "object-copy": "^0.1.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="
+            "define-property": {
+              "version": "0.2.5",
+              "bundled": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
             }
           }
         },
-        "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==",
+        "string-width": {
+          "version": "2.1.1",
+          "bundled": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "strip-ansi": {
+          "version": "4.0.0",
+          "bundled": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "ansi-regex": "^3.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=",
+        "strip-bom": {
+          "version": "2.0.0",
+          "bundled": 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"
-          },
-          "dependencies": {
-            "supports-color": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
-            }
+            "is-utf8": "^0.2.0"
           }
         },
-        "has-flag": {
+        "strip-eof": {
           "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+          "bundled": true
+        },
+        "test-exclude": {
+          "version": "4.2.1",
+          "bundled": true,
+          "requires": {
+            "arrify": "^1.0.1",
+            "micromatch": "^3.1.8",
+            "object-assign": "^4.1.0",
+            "read-pkg-up": "^1.0.1",
+            "require-main-filename": "^1.0.1"
+          }
         },
-        "postcss": {
-          "version": "5.2.18",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
-          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+        "to-object-path": {
+          "version": "0.3.0",
+          "bundled": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "kind-of": "^3.0.2"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "to-regex": {
+          "version": "3.0.2",
+          "bundled": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "regex-not": "^1.0.2",
+            "safe-regex": "^1.1.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=",
+        "to-regex-range": {
+          "version": "2.1.1",
+          "bundled": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        },
+        "uglify-js": {
+          "version": "2.8.29",
+          "bundled": 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"
+            "source-map": "~0.5.1",
+            "uglify-to-browserify": "~1.0.0",
+            "yargs": "~3.10.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="
+            "yargs": {
+              "version": "3.10.0",
+              "bundled": true,
+              "optional": true,
+              "requires": {
+                "camelcase": "^1.0.2",
+                "cliui": "^2.1.0",
+                "decamelize": "^1.0.0",
+                "window-size": "0.1.0"
+              }
             }
           }
         },
-        "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        "uglify-to-browserify": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
         },
-        "postcss": {
-          "version": "5.2.18",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
-          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+        "union-value": {
+          "version": "1.0.0",
+          "bundled": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "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",
+              "bundled": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            },
+            "set-value": {
+              "version": "0.4.3",
+              "bundled": true,
+              "requires": {
+                "extend-shallow": "^2.0.1",
+                "is-extendable": "^0.1.1",
+                "is-plain-object": "^2.0.1",
+                "to-object-path": "^0.3.0"
+              }
+            }
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "unset-value": {
+          "version": "1.0.0",
+          "bundled": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "has-value": "^0.3.1",
+            "isobject": "^3.0.0"
+          },
+          "dependencies": {
+            "has-value": {
+              "version": "0.3.1",
+              "bundled": true,
+              "requires": {
+                "get-value": "^2.0.3",
+                "has-values": "^0.1.4",
+                "isobject": "^2.0.0"
+              },
+              "dependencies": {
+                "isobject": {
+                  "version": "2.1.0",
+                  "bundled": true,
+                  "requires": {
+                    "isarray": "1.0.0"
+                  }
+                }
+              }
+            },
+            "has-values": {
+              "version": "0.1.4",
+              "bundled": true
+            }
           }
-        }
-      }
-    },
-    "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=",
+        "urix": {
+          "version": "0.1.0",
+          "bundled": true
+        },
+        "use": {
+          "version": "3.1.0",
+          "bundled": 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"
+            "kind-of": "^6.0.2"
           },
           "dependencies": {
-            "supports-color": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            "kind-of": {
+              "version": "6.0.2",
+              "bundled": true
             }
           }
         },
-        "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        "validate-npm-package-license": {
+          "version": "3.0.3",
+          "bundled": true,
+          "requires": {
+            "spdx-correct": "^3.0.0",
+            "spdx-expression-parse": "^3.0.0"
+          }
         },
-        "postcss": {
-          "version": "5.2.18",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
-          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+        "which": {
+          "version": "1.3.1",
+          "bundled": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "isexe": "^2.0.0"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "which-module": {
+          "version": "2.0.0",
+          "bundled": true
+        },
+        "window-size": {
+          "version": "0.1.0",
+          "bundled": true,
+          "optional": true
+        },
+        "wordwrap": {
+          "version": "0.0.3",
+          "bundled": true
+        },
+        "wrap-ansi": {
+          "version": "2.1.0",
+          "bundled": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "2.1.1",
+              "bundled": true
+            },
+            "is-fullwidth-code-point": {
+              "version": "1.0.0",
+              "bundled": true,
+              "requires": {
+                "number-is-nan": "^1.0.0"
+              }
+            },
+            "string-width": {
+              "version": "1.0.2",
+              "bundled": true,
+              "requires": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+              }
+            },
+            "strip-ansi": {
+              "version": "3.0.1",
+              "bundled": true,
+              "requires": {
+                "ansi-regex": "^2.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=",
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "write-file-atomic": {
+          "version": "1.3.4",
+          "bundled": 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"
-          },
-          "dependencies": {
-            "supports-color": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
-            }
+            "graceful-fs": "^4.1.11",
+            "imurmurhash": "^0.1.4",
+            "slide": "^1.1.5"
           }
         },
-        "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        "y18n": {
+          "version": "3.2.1",
+          "bundled": true
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "bundled": true
         },
-        "postcss": {
-          "version": "5.2.18",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
-          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+        "yargs": {
+          "version": "11.1.0",
+          "bundled": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "cliui": "^4.0.0",
+            "decamelize": "^1.1.1",
+            "find-up": "^2.1.0",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^2.0.0",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^2.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^3.2.1",
+            "yargs-parser": "^9.0.2"
+          },
+          "dependencies": {
+            "camelcase": {
+              "version": "4.1.0",
+              "bundled": true
+            },
+            "cliui": {
+              "version": "4.1.0",
+              "bundled": true,
+              "requires": {
+                "string-width": "^2.1.1",
+                "strip-ansi": "^4.0.0",
+                "wrap-ansi": "^2.0.0"
+              }
+            },
+            "yargs-parser": {
+              "version": "9.0.2",
+              "bundled": true,
+              "requires": {
+                "camelcase": "^4.1.0"
+              }
+            }
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "yargs-parser": {
+          "version": "8.1.0",
+          "bundled": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "camelcase": "^4.1.0"
+          },
+          "dependencies": {
+            "camelcase": {
+              "version": "4.1.0",
+              "bundled": true
+            }
           }
         }
       }
     },
-    "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=",
+    "oauth-sign": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+      "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
       "requires": {
-        "postcss": "5.2.18",
-        "uniqid": "4.1.1"
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.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=",
+        "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": {
-            "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="
-            }
+            "is-descriptor": "^0.1.0"
           }
         },
-        "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        "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.0.2"
+          }
         },
-        "postcss": {
-          "version": "5.2.18",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
-          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+        "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": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "kind-of": "^3.0.2"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "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": {
-            "has-flag": "1.0.0"
+            "is-accessor-descriptor": "^0.1.6",
+            "is-data-descriptor": "^0.1.4",
+            "kind-of": "^5.0.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==",
+              "dev": true
+            }
           }
         }
       }
     },
-    "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==",
+    "object-keys": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz",
+      "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==",
+      "dev": true
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
       "requires": {
-        "postcss": "6.0.20"
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
       }
     },
-    "postcss-import": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz",
-      "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==",
+    "object.getownpropertydescriptors": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
+      "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
       "dev": true,
       "requires": {
-        "postcss": "6.0.20",
-        "postcss-value-parser": "3.3.0",
-        "read-cache": "1.0.0",
-        "resolve": "1.5.0"
+        "define-properties": "^1.1.2",
+        "es-abstract": "^1.5.1"
       }
     },
-    "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=",
+    "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": {
-        "cosmiconfig": "2.2.2",
-        "object-assign": "4.1.1",
-        "postcss-load-options": "1.2.0",
-        "postcss-load-plugins": "2.3.0"
+        "for-own": "^0.1.4",
+        "is-extendable": "^0.1.1"
       }
     },
-    "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=",
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
       "requires": {
-        "cosmiconfig": "2.2.2",
-        "object-assign": "4.1.1"
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        }
       }
     },
-    "postcss-load-plugins": {
+    "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/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz",
-      "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
       "requires": {
-        "cosmiconfig": "2.2.2",
-        "object-assign": "4.1.1"
+        "ee-first": "1.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==",
+    "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
+    },
+    "onap-ui-angular": {
+      "version": "5.1.71",
+      "resolved": "https://registry.npmjs.org/onap-ui-angular/-/onap-ui-angular-5.1.71.tgz",
+      "integrity": "sha512-CMIJKE2Kx4Y85/DXG7svbUymGjXXJ2qKiInXuXTs1MrDTpKur9ksx/l1I8/AAFx5rOuXFEHM6uSAChXjR0OPQQ==",
+      "dev": true,
       "requires": {
-        "loader-utils": "1.1.0",
-        "postcss": "6.0.20",
-        "postcss-load-config": "1.2.0",
-        "schema-utils": "0.4.5"
+        "angular-base64-upload": "^0.1.23",
+        "core-js": "^2.5.7",
+        "onap-ui-common": "^1.0.86",
+        "rxjs-compat": "^6.2.0"
       }
     },
-    "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=",
+    "onap-ui-common": {
+      "version": "1.0.86",
+      "resolved": "https://registry.npmjs.org/onap-ui-common/-/onap-ui-common-1.0.86.tgz",
+      "integrity": "sha512-27Mvn67/3LdpEUN9ihCrdNmmLWgEChWd5mtPGIS9N2Rcuhoy5naA4Fncut1NkLyFJJJ5B/HAg8+7AHIY1OqXdQ==",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
       "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"
-          }
-        }
+        "wrappy": "1"
       }
     },
-    "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"
-          }
-        }
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^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"
-          }
-        }
+    "opn": {
+      "version": "5.3.0",
+      "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
+      "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.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="
+    "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.1",
+        "wordwrap": "~0.0.2"
+      }
     },
-    "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=",
+    "optionator": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
       "requires": {
-        "object-assign": "4.1.1",
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.4",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "wordwrap": "~1.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": {
+        "wordwrap": {
           "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"
-          }
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
         }
       }
     },
-    "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=",
+    "ora": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz",
+      "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=",
+      "dev": true,
       "requires": {
-        "postcss": "5.2.18",
-        "postcss-value-parser": "3.3.0"
+        "chalk": "^1.1.1",
+        "cli-cursor": "^1.0.2",
+        "cli-spinners": "^0.1.2",
+        "object-assign": "^4.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="
+          "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"
-          },
-          "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"
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.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=",
+        "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": {
-            "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="
-            }
+            "restore-cursor": "^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="
+        "onetime": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+          "dev": true
         },
-        "postcss": {
-          "version": "5.2.18",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
-          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+        "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": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "exit-hook": "^1.0.0",
+            "onetime": "^1.0.0"
           }
         },
         "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"
-          }
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
         }
       }
     },
-    "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=",
+    "original": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+      "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+      "dev": true,
       "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"
-          }
-        }
+        "url-parse": "^1.4.3"
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "dev": true
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+      "dev": true
+    },
+    "os-locale": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+      "dev": true,
+      "optional": 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=",
+      "dev": true
+    },
+    "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.0",
+        "os-tmpdir": "^1.0.0"
+      }
+    },
+    "p-defer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+      "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+      "dev": true
+    },
+    "p-each-series": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz",
+      "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=",
+      "dev": true,
+      "requires": {
+        "p-reduce": "^1.0.0"
+      }
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-is-promise": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
+      "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
+      "dev": true
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "p-try": "^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=",
+    "p-locate": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "dev": true,
       "requires": {
-        "postcss": "6.0.20"
+        "p-limit": "^1.1.0"
       }
     },
-    "postcss-modules-local-by-default": {
+    "p-map": {
       "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"
-      }
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+      "dev": true
     },
-    "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"
-      }
+    "p-reduce": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
+      "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
+      "dev": true
     },
-    "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"
-      }
+    "p-try": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+      "dev": true
     },
-    "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"
+    "pacote": {
+      "version": "9.1.1",
+      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.1.1.tgz",
+      "integrity": "sha512-f28Rq5ozzKAA9YwIKw61/ipwAatUZseYmVssDbHHaexF0wRIVotapVEZPAjOT7Eu3LYVqEp0NVpNizoAnYBUaA==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.2",
+        "cacache": "^11.2.0",
+        "figgy-pudding": "^3.5.1",
+        "get-stream": "^4.1.0",
+        "glob": "^7.1.3",
+        "lru-cache": "^4.1.3",
+        "make-fetch-happen": "^4.0.1",
+        "minimatch": "^3.0.4",
+        "minipass": "^2.3.5",
+        "mississippi": "^3.0.0",
+        "mkdirp": "^0.5.1",
+        "normalize-package-data": "^2.4.0",
+        "npm-package-arg": "^6.1.0",
+        "npm-packlist": "^1.1.12",
+        "npm-pick-manifest": "^2.1.0",
+        "npm-registry-fetch": "^3.8.0",
+        "osenv": "^0.1.5",
+        "promise-inflight": "^1.0.1",
+        "promise-retry": "^1.1.1",
+        "protoduck": "^5.0.1",
+        "rimraf": "^2.6.2",
+        "safe-buffer": "^5.1.2",
+        "semver": "^5.6.0",
+        "ssri": "^6.0.1",
+        "tar": "^4.4.6",
+        "unique-filename": "^1.1.1",
+        "which": "^1.3.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=",
+        "cacache": {
+          "version": "11.3.2",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz",
+          "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==",
+          "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"
+            "bluebird": "^3.5.3",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.3",
+            "graceful-fs": "^4.1.15",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.2",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.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="
+            "lru-cache": {
+              "version": "5.1.1",
+              "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+              "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+              "dev": true,
+              "requires": {
+                "yallist": "^3.0.2"
+              }
             }
           }
         },
-        "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==",
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "dev": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "pump": "^3.0.0"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "glob": {
+          "version": "7.1.3",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+          "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+          "dev": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^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=",
+        "graceful-fs": {
+          "version": "4.1.15",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+          "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "4.1.5",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+          "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+          "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"
+            "pseudomap": "^1.0.2",
+            "yallist": "^2.1.2"
           },
           "dependencies": {
-            "supports-color": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            "yallist": {
+              "version": "2.1.2",
+              "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+              "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+              "dev": true
             }
           }
         },
-        "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==",
+        "mississippi": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+          "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+          "dev": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "concat-stream": "^1.5.0",
+            "duplexify": "^3.4.2",
+            "end-of-stream": "^1.1.0",
+            "flush-write-stream": "^1.0.0",
+            "from2": "^2.1.0",
+            "parallel-transform": "^1.1.0",
+            "pump": "^3.0.0",
+            "pumpify": "^1.3.3",
+            "stream-each": "^1.1.0",
+            "through2": "^2.0.0"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
           }
-        }
-      }
-    },
-    "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=",
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+          "dev": true
+        },
+        "semver": {
+          "version": "5.6.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+          "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "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"
-          },
-          "dependencies": {
-            "supports-color": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
-            }
+            "figgy-pudding": "^3.5.1"
           }
         },
-        "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==",
+        "tar": {
+          "version": "4.4.8",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
+          "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
+          "dev": true,
           "requires": {
-            "chalk": "1.1.3",
-            "js-base64": "2.4.3",
-            "source-map": "0.5.7",
-            "supports-color": "3.2.3"
+            "chownr": "^1.1.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.3.4",
+            "minizlib": "^1.1.1",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.2"
           }
         },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "dev": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "isexe": "^2.0.0"
           }
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
+          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
+          "dev": true
         }
       }
     },
-    "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=",
+    "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==",
+      "dev": true
+    },
+    "parallel-transform": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
+      "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
+      "dev": true,
+      "requires": {
+        "cyclist": "~0.2.2",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz",
+      "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=",
+      "dev": true,
+      "requires": {
+        "asn1.js": "^4.0.0",
+        "browserify-aes": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3"
+      }
+    },
+    "parse-diff": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/parse-diff/-/parse-diff-0.3.2.tgz",
+      "integrity": "sha1-QH1sHmzKs4e8aU6KWN38iJiamhs="
+    },
+    "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.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.0"
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "^1.2.0"
+      }
+    },
+    "parse5": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
+      "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==",
+      "optional": true
+    },
+    "parseurl": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "path-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+      "dev": 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=",
+      "dev": true
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "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="
+    },
+    "pidtree": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz",
+      "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==",
+      "dev": true
+    },
+    "pify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+      "dev": true
+    },
+    "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": {
-        "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"
-          }
-        }
+        "pinkie": "^2.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=",
+    "pirates": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
+      "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
+      "dev": true,
       "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"
-          }
-        }
+        "node-modules-regexp": "^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=",
+    "pixelmatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
+      "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=",
       "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"
-          }
-        }
+        "pngjs": "^3.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=",
+    "pkg-dir": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+      "dev": true,
       "requires": {
-        "flatten": "1.0.2",
-        "indexes-of": "1.0.1",
-        "uniq": "1.0.1"
+        "find-up": "^2.1.0"
       }
     },
-    "postcss-svgo": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz",
-      "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=",
+    "pkginfo": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.0.tgz",
+      "integrity": "sha1-NJ27f/04CB/K3AhT32h/DHdEzWU="
+    },
+    "please-upgrade-node": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz",
+      "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==",
+      "dev": true,
       "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"
-          }
-        }
+        "semver-compare": "^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=",
+    "pn": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
+      "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
+      "dev": true
+    },
+    "pngjs": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.3.tgz",
+      "integrity": "sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q=="
+    },
+    "point-in-polygon": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.0.1.tgz",
+      "integrity": "sha1-1Ztk6P7kHElFiqyCtWcYxZV7Kvc="
+    },
+    "portfinder": {
+      "version": "1.0.17",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.17.tgz",
+      "integrity": "sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ==",
+      "dev": true,
       "requires": {
-        "alphanum-sort": "1.0.2",
-        "postcss": "5.2.18",
-        "uniqs": "2.0.0"
+        "async": "^1.5.2",
+        "debug": "^2.2.0",
+        "mkdirp": "0.5.x"
       },
       "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"
-          }
+        "async": {
+          "version": "1.5.2",
+          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+          "dev": true
         }
       }
     },
-    "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="
+    "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=",
+      "dev": true
     },
-    "postcss-zindex": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz",
-      "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=",
+    "postcss": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz",
+      "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==",
+      "dev": true,
       "requires": {
-        "has": "1.0.1",
-        "postcss": "5.2.18",
-        "uniqs": "2.0.0"
+        "chalk": "^2.4.1",
+        "source-map": "^0.6.1",
+        "supports-color": "^5.5.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=",
+          "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": "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="
-            }
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
           }
         },
         "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
         },
-        "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"
-          }
+        "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
         },
         "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
           "requires": {
-            "has-flag": "1.0.0"
+            "has-flag": "^3.0.0"
           }
         }
       }
     },
+    "postcss-import": {
+      "version": "12.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.0.tgz",
+      "integrity": "sha512-3KqKRZcaZAvxbY8DVLdd81tG5uKzbUQuiWIvy0o0fzEC42bKacqPYFWbfCQyw6L4LWUaqPz/idvIdbhpgQ32eQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.1",
+        "postcss-value-parser": "^3.2.3",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
+      }
+    },
+    "postcss-load-config": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz",
+      "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^4.0.0",
+        "import-cwd": "^2.0.0"
+      }
+    },
+    "postcss-loader": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
+      "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "postcss": "^7.0.0",
+        "postcss-load-config": "^2.0.0",
+        "schema-utils": "^1.0.0"
+      }
+    },
+    "postcss-value-parser": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+      "dev": true
+    },
     "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
+      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
     },
     "prepend-http": {
       "version": "1.0.4",
       "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=",
+    "prettier": {
+      "version": "1.16.4",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz",
+      "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==",
+      "dev": true
+    },
+    "pretty-format": {
+      "version": "24.0.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.0.0.tgz",
+      "integrity": "sha512-LszZaKG665djUcqg5ZQq+XzezHLKrxsA86ZABTozp+oNhkdqa+tG2dX4qa6ERl5c/sRDrAa3lHmwnvKoP+OG/g==",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^4.0.0",
+        "ansi-styles": "^3.2.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz",
+          "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==",
+          "dev": true
+        }
+      }
+    },
+    "pretty-quick": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-1.10.0.tgz",
+      "integrity": "sha512-uNvm2N3UWmnZRZrClyQI45hIbV20f5BpSyZY51Spbvn4APp9+XLyX4bCjWRGT3fGyVyQ/2/iw7dbQq1UUaq7SQ==",
+      "dev": true,
       "requires": {
-        "renderkid": "2.0.1",
-        "utila": "0.4.0"
+        "chalk": "^2.3.0",
+        "execa": "^0.8.0",
+        "find-up": "^2.1.0",
+        "ignore": "^3.3.7",
+        "mri": "^1.1.0",
+        "multimatch": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.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=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "0.8.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
+          "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.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.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.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=="
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+      "dev": true
     },
     "process": {
       "version": "0.11.10",
       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "dev": true
     },
     "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=="
+      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+      "dev": true
     },
     "progress": {
       "version": "1.1.8",
       "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
       "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
       "requires": {
-        "asap": "2.0.6"
+        "asap": "~2.0.3"
       }
     },
     "promise-inflight": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+      "dev": true
     },
-    "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==",
+    "promise-retry": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz",
+      "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=",
+      "dev": true,
       "requires": {
-        "define-properties": "1.1.2",
-        "es-abstract": "1.10.0",
-        "function-bind": "1.1.1"
+        "err-code": "^1.0.0",
+        "retry": "^0.10.0"
       }
     },
-    "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==",
+    "prompts": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.3.tgz",
+      "integrity": "sha512-H8oWEoRZpybm6NV4to9/1limhttEo13xK62pNvn2JzY0MA03p7s0OjtmhXyon3uJmxiJJVSuUwEJFFssI3eBiQ==",
+      "dev": true,
       "requires": {
-        "fbjs": "0.8.16",
-        "loose-envify": "1.3.1",
-        "object-assign": "4.1.1"
+        "kleur": "^3.0.2",
+        "sisteransi": "^1.0.0"
       }
     },
-    "protractor": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz",
-      "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=",
+    "protoduck": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz",
+      "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==",
       "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"
-          }
-        }
+        "genfun": "^5.0.0"
       }
     },
     "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=",
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
+      "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
       "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
-        }
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.8.0"
       }
     },
     "prr": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "dev": true
     },
     "pseudomap": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "dev": true
+    },
+    "psl": {
+      "version": "1.1.31",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
+      "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
+      "dev": true
     },
     "public-encrypt": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz",
       "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=",
+      "dev": true,
       "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"
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1"
       }
     },
     "pump": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
       "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+      "dev": true,
       "requires": {
-        "end-of-stream": "1.4.1",
-        "once": "1.4.0"
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
       }
     },
     "pumpify": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz",
-      "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==",
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+      "dev": true,
       "requires": {
-        "duplexify": "3.5.4",
-        "inherits": "2.0.3",
-        "pump": "2.0.1"
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
       }
     },
     "punycode": {
       "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"
-      }
+      "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM="
     },
     "querystring": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "dev": true
     },
     "querystring-es3": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "dev": true
     },
     "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"
-          }
-        }
-      }
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz",
+      "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==",
+      "dev": true
+    },
+    "quickselect": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz",
+      "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ=="
     },
     "ramda": {
-      "version": "0.21.0",
-      "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz",
-      "integrity": "sha1-oAGr7bP/YQd9T/HVd9RN536NCjU="
+      "version": "0.24.1",
+      "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz",
+      "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=",
+      "dev": true
     },
     "randomatic": {
       "version": "1.1.7",
       "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
       "dev": true,
       "requires": {
-        "is-number": "3.0.0",
-        "kind-of": "4.0.0"
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
       },
       "dependencies": {
         "is-number": {
           "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
           "dev": true,
           "requires": {
-            "kind-of": "3.2.2"
+            "kind-of": "^3.0.2"
           },
           "dependencies": {
             "kind-of": {
               "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
               "dev": true,
               "requires": {
-                "is-buffer": "1.1.6"
+                "is-buffer": "^1.1.5"
               }
-            }
-          }
-        },
-        "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=="
+            }
+          }
+        },
+        "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.5"
+          }
         }
       }
     },
-    "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==",
+    "randombytes": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+      "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
+      "dev": true,
       "requires": {
-        "react-icon-base": "2.1.0"
+        "safe-buffer": "^5.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==",
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "is-dom": "1.0.9"
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
       }
     },
-    "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"
-      }
+    "range-parser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+      "dev": true
     },
-    "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==",
+    "raw-body": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
+      "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
+      "dev": true,
       "requires": {
-        "inline-style-prefixer": "3.0.8",
-        "prop-types": "15.6.1",
-        "react-style-proptype": "3.2.1"
+        "bytes": "3.0.0",
+        "http-errors": "1.6.3",
+        "iconv-lite": "0.4.23",
+        "unpipe": "1.0.0"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.23",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+          "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        }
       }
     },
-    "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"
-      }
+    "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-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==",
+    "rbush": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz",
+      "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==",
       "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"
+        "quickselect": "^1.0.1"
       }
     },
-    "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==",
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
       "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"
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+        }
       }
     },
     "read-cache": {
       "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
       "dev": true,
       "requires": {
-        "pify": "2.3.0"
+        "pify": "^2.3.0"
       },
       "dependencies": {
         "pify": {
         }
       }
     },
+    "read-json-sync": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/read-json-sync/-/read-json-sync-1.1.1.tgz",
+      "integrity": "sha1-Q8ZproZKrjCN+7snIaZ+KV7I//Y=",
+      "requires": {
+        "graceful-fs": "^4.1.2"
+      }
+    },
     "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"
+        "load-json-file": "^1.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^1.0.0"
       },
       "dependencies": {
         "path-type": {
           "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
           "dev": true,
           "requires": {
-            "graceful-fs": "4.1.11",
-            "pify": "2.3.0",
-            "pinkie-promise": "2.0.1"
+            "graceful-fs": "^4.1.2",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
           }
         },
         "pify": {
       "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
       "dev": true,
       "requires": {
-        "find-up": "1.1.2",
-        "read-pkg": "1.1.0"
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
       },
       "dependencies": {
         "find-up": {
           "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
           "dev": true,
           "requires": {
-            "path-exists": "2.1.0",
-            "pinkie-promise": "2.0.1"
+            "path-exists": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
           }
         },
         "path-exists": {
           "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
           "dev": true,
           "requires": {
-            "pinkie-promise": "2.0.1"
+            "pinkie-promise": "^2.0.0"
           }
         }
       }
       "version": "2.3.5",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
       "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
+      "dev": true,
       "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"
+        "core-util-is": "~1.0.0",
+        "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.1"
       }
     },
     "readdirp": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
       "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+      "dev": true,
       "requires": {
-        "graceful-fs": "4.1.11",
-        "minimatch": "3.0.4",
-        "readable-stream": "2.3.5",
-        "set-immediate-shim": "1.0.1"
+        "graceful-fs": "^4.1.2",
+        "minimatch": "^3.0.2",
+        "readable-stream": "^2.0.2",
+        "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==",
+    "realpath-native": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz",
+      "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==",
+      "dev": true,
       "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=="
-        }
+        "util.promisify": "^1.0.0"
       }
     },
     "rechoir": {
       "version": "0.6.2",
       "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
       "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+      "dev": true,
       "requires": {
-        "resolve": "1.5.0"
+        "resolve": "^1.1.6"
       }
     },
-    "recursive-readdir": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz",
-      "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=",
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "optional": true,
       "requires": {
-        "minimatch": "3.0.3"
+        "indent-string": "^2.1.0",
+        "strip-indent": "^1.0.1"
+      }
+    },
+    "redux": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz",
+      "integrity": "sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==",
+      "requires": {
+        "loose-envify": "^1.4.0",
+        "symbol-observable": "^1.2.0"
       },
       "dependencies": {
-        "minimatch": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
-          "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
+        "loose-envify": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+          "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
           "requires": {
-            "brace-expansion": "1.1.11"
+            "js-tokens": "^3.0.0 || ^4.0.0"
           }
         }
       }
     },
-    "redent": {
+    "redux-observable": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redux-observable/-/redux-observable-1.0.0.tgz",
+      "integrity": "sha512-6bXnpqWTBeLaLQjXHyN1giXq4nLxCmv+SUkdmiwBgvmVxvDbdmydvL1Z7DGo0WItyzI/kqXQKiucUuTxnrPRkA=="
+    },
+    "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==",
+      "dev": true
+    },
+    "regenerate": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+      "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+      "dev": true
+    },
+    "regenerate-unicode-properties": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz",
+      "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.0"
+      },
+      "dependencies": {
+        "regenerate": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+          "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+          "dev": true
+        }
+      }
+    },
+    "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==",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.18.0",
+        "babel-types": "^6.19.0",
+        "private": "^0.1.6"
+      }
+    },
+    "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==",
+      "dev": true,
+      "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=",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.2.1",
+        "regjsgen": "^0.2.0",
+        "regjsparser": "^0.1.4"
+      }
+    },
+    "registry-url": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+      "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+      "requires": {
+        "rc": "^1.0.1"
+      }
+    },
+    "regjsgen": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+      "dev": true
+    },
+    "regjsparser": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+      "dev": true,
+      "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=",
+          "dev": true
+        }
+      }
+    },
+    "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=",
+      "dev": true
+    },
+    "repeat-element": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "requires": {
+        "is-finite": "^1.0.0"
+      }
+    },
+    "request": {
+      "version": "2.81.0",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+      "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+      "requires": {
+        "aws-sign2": "~0.6.0",
+        "aws4": "^1.2.1",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.5",
+        "extend": "~3.0.0",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.1.1",
+        "har-validator": "~4.2.1",
+        "hawk": "~3.1.3",
+        "http-signature": "~1.1.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.7",
+        "oauth-sign": "~0.8.1",
+        "performance-now": "^0.2.0",
+        "qs": "~6.4.0",
+        "safe-buffer": "^5.0.1",
+        "stringstream": "~0.0.4",
+        "tough-cookie": "~2.3.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.0.0"
+      }
+    },
+    "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"
+      }
+    },
+    "request-promise-core": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz",
+      "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.11"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+          "dev": true
+        }
+      }
+    },
+    "request-promise-native": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz",
+      "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==",
+      "dev": true,
+      "requires": {
+        "request-promise-core": "1.1.2",
+        "stealthy-require": "^1.1.1",
+        "tough-cookie": "^2.3.3"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true
+    },
+    "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==",
+      "dev": true
+    },
+    "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=",
+      "dev": true
+    },
+    "requires-port": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
-      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+      "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
       "dev": true,
       "requires": {
-        "indent-string": "2.1.0",
-        "strip-indent": "1.0.1"
+        "path-parse": "^1.0.5"
       }
     },
-    "redis": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz",
-      "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==",
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
       "dev": true,
-      "optional": true,
       "requires": {
-        "double-ended-queue": "2.1.0-0",
-        "redis-commands": "1.3.5",
-        "redis-parser": "2.6.0"
+        "resolve-from": "^3.0.0"
       }
     },
-    "redis-commands": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz",
-      "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==",
+    "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=",
+      "dev": true
+    },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
       "dev": true,
-      "optional": true
+      "requires": {
+        "onetime": "^2.0.0",
+        "signal-exit": "^3.0.2"
+      }
     },
-    "redis-parser": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz",
-      "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=",
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "dev": true
+    },
+    "retry": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
+      "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=",
+      "dev": true
+    },
+    "right-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
       "dev": true,
-      "optional": true
+      "requires": {
+        "align-text": "^0.1.1"
+      }
     },
-    "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=",
+    "rimraf": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+      "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
       "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="
-        }
+        "glob": "^7.0.5"
       }
     },
-    "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=",
+    "ripemd160": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
+      "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=",
+      "dev": true,
       "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="
-        }
+        "hash-base": "^2.0.0",
+        "inherits": "^2.0.1"
       }
     },
-    "redux": {
-      "version": "3.7.2",
-      "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz",
-      "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==",
+    "robust-orientation": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/robust-orientation/-/robust-orientation-1.1.3.tgz",
+      "integrity": "sha1-2v9bANO+TmByLw6cAVbvln8cIEk=",
       "requires": {
-        "lodash": "4.17.5",
-        "lodash-es": "4.17.8",
-        "loose-envify": "1.3.1",
-        "symbol-observable": "1.2.0"
+        "robust-scale": "^1.0.2",
+        "robust-subtract": "^1.0.0",
+        "robust-sum": "^1.0.0",
+        "two-product": "^1.0.2"
       }
     },
-    "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==",
+    "robust-scale": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/robust-scale/-/robust-scale-1.0.2.tgz",
+      "integrity": "sha1-d1Ey7QlULQKOWLLMecBikLz3jDI=",
       "requires": {
-        "gitbook-plugin-github": "2.0.0"
+        "two-product": "^1.0.2",
+        "two-sum": "^1.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=="
+    "robust-subtract": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/robust-subtract/-/robust-subtract-1.0.0.tgz",
+      "integrity": "sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo="
     },
-    "regenerate": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
-      "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg=="
+    "robust-sum": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/robust-sum/-/robust-sum-1.0.0.tgz",
+      "integrity": "sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k="
     },
-    "regenerator-runtime": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+    "rsvp": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz",
+      "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==",
+      "dev": true
     },
-    "regenerator-transform": {
-      "version": "0.10.1",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
-      "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+    "run-async": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+      "dev": true,
       "requires": {
-        "babel-runtime": "6.26.0",
-        "babel-types": "6.26.0",
-        "private": "0.1.8"
+        "is-promise": "^2.1.0"
       }
     },
-    "regex-cache": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
-      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+    "run-node": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz",
+      "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==",
+      "dev": true
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
       "dev": true,
       "requires": {
-        "is-equal-shallow": "0.1.3"
+        "aproba": "^1.1.1"
       }
     },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+    "rxjs": {
+      "version": "6.3.3",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+      "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
       "requires": {
-        "extend-shallow": "3.0.2",
-        "safe-regex": "1.1.0"
+        "tslib": "^1.9.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"
-      }
+    "rxjs-compat": {
+      "version": "6.3.3",
+      "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.3.3.tgz",
+      "integrity": "sha512-caGN7ixiabHpOofginKEquuHk7GgaCrC7UpUQ9ZqGp80tMc68msadOeP/2AKy2R4YJsT1+TX5GZCtxO82qWkyA=="
     },
-    "regjsgen": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
-      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc="
+    "safe-buffer": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
     },
-    "regjsparser": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
-      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+    "safe-json-stringify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz",
+      "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==",
+      "optional": true
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
       "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="
-        }
+        "ret": "~0.1.10"
       }
     },
-    "relateurl": {
-      "version": "0.2.7",
-      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
-      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
     },
-    "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"
+    "sane": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/sane/-/sane-3.1.0.tgz",
+      "integrity": "sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q==",
+      "dev": true,
+      "requires": {
+        "anymatch": "^2.0.0",
+        "capture-exit": "^1.2.0",
+        "exec-sh": "^0.2.0",
+        "execa": "^1.0.0",
+        "fb-watchman": "^2.0.0",
+        "fsevents": "^1.2.3",
+        "micromatch": "^3.1.4",
+        "minimist": "^1.1.1",
+        "walker": "~1.0.5",
+        "watch": "~0.18.0"
       },
       "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=",
+        "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.4",
+            "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
         },
-        "readable-stream": {
-          "version": "2.0.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
-          "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.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.0"
+              }
+            }
+          }
+        },
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^4.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.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.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "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.0"
+              }
+            },
+            "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.0.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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "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.0"
+              }
+            }
+          }
+        },
+        "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": {
-            "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"
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.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=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fsevents": {
+          "version": "1.2.7",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz",
+          "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "nan": "^2.9.2",
+            "node-pre-gyp": "^0.10.0"
+          },
+          "dependencies": {
+            "abbrev": {
+              "version": "1.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "ansi-regex": {
+              "version": "2.1.1",
+              "bundled": true,
+              "dev": true
+            },
+            "aproba": {
+              "version": "1.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "are-we-there-yet": {
+              "version": "1.1.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "delegates": "^1.0.0",
+                "readable-stream": "^2.0.6"
+              }
+            },
+            "balanced-match": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true
+            },
+            "brace-expansion": {
+              "version": "1.1.11",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+              }
+            },
+            "chownr": {
+              "version": "1.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "code-point-at": {
+              "version": "1.1.0",
+              "bundled": true,
+              "dev": true
+            },
+            "concat-map": {
+              "version": "0.0.1",
+              "bundled": true,
+              "dev": true
+            },
+            "console-control-strings": {
+              "version": "1.1.0",
+              "bundled": true,
+              "dev": true
+            },
+            "core-util-is": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "debug": {
+              "version": "2.6.9",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ms": "2.0.0"
+              }
+            },
+            "deep-extend": {
+              "version": "0.6.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "delegates": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "detect-libc": {
+              "version": "1.0.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "fs-minipass": {
+              "version": "1.2.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minipass": "^2.2.1"
+              }
+            },
+            "fs.realpath": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "gauge": {
+              "version": "2.7.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "aproba": "^1.0.3",
+                "console-control-strings": "^1.0.0",
+                "has-unicode": "^2.0.0",
+                "object-assign": "^4.1.0",
+                "signal-exit": "^3.0.0",
+                "string-width": "^1.0.1",
+                "strip-ansi": "^3.0.1",
+                "wide-align": "^1.1.0"
+              }
+            },
+            "glob": {
+              "version": "7.1.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.0.4",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+              }
+            },
+            "has-unicode": {
+              "version": "2.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "iconv-lite": {
+              "version": "0.4.24",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "safer-buffer": ">= 2.1.2 < 3"
+              }
+            },
+            "ignore-walk": {
+              "version": "3.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minimatch": "^3.0.4"
+              }
+            },
+            "inflight": {
+              "version": "1.0.6",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "once": "^1.3.0",
+                "wrappy": "1"
+              }
+            },
+            "inherits": {
+              "version": "2.0.3",
+              "bundled": true,
+              "dev": true
+            },
+            "ini": {
+              "version": "1.3.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "is-fullwidth-code-point": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "number-is-nan": "^1.0.0"
+              }
+            },
+            "isarray": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "minimatch": {
+              "version": "3.0.4",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "brace-expansion": "^1.1.7"
+              }
+            },
+            "minimist": {
+              "version": "0.0.8",
+              "bundled": true,
+              "dev": true
+            },
+            "minipass": {
+              "version": "2.3.5",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "safe-buffer": "^5.1.2",
+                "yallist": "^3.0.0"
+              }
+            },
+            "minizlib": {
+              "version": "1.2.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minipass": "^2.2.1"
+              }
+            },
+            "mkdirp": {
+              "version": "0.5.1",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "minimist": "0.0.8"
+              }
+            },
+            "ms": {
+              "version": "2.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "needle": {
+              "version": "2.2.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "debug": "^2.1.2",
+                "iconv-lite": "^0.4.4",
+                "sax": "^1.2.4"
+              }
+            },
+            "node-pre-gyp": {
+              "version": "0.10.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "detect-libc": "^1.0.2",
+                "mkdirp": "^0.5.1",
+                "needle": "^2.2.1",
+                "nopt": "^4.0.1",
+                "npm-packlist": "^1.1.6",
+                "npmlog": "^4.0.2",
+                "rc": "^1.2.7",
+                "rimraf": "^2.6.1",
+                "semver": "^5.3.0",
+                "tar": "^4"
+              }
+            },
+            "nopt": {
+              "version": "4.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "abbrev": "1",
+                "osenv": "^0.1.4"
+              }
+            },
+            "npm-bundled": {
+              "version": "1.0.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "npm-packlist": {
+              "version": "1.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ignore-walk": "^3.0.1",
+                "npm-bundled": "^1.0.1"
+              }
+            },
+            "npmlog": {
+              "version": "4.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "are-we-there-yet": "~1.1.2",
+                "console-control-strings": "~1.1.0",
+                "gauge": "~2.7.3",
+                "set-blocking": "~2.0.0"
+              }
+            },
+            "number-is-nan": {
+              "version": "1.0.1",
+              "bundled": true,
+              "dev": true
+            },
+            "object-assign": {
+              "version": "4.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "once": {
+              "version": "1.4.0",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "wrappy": "1"
+              }
+            },
+            "os-homedir": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "os-tmpdir": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "osenv": {
+              "version": "0.1.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "os-homedir": "^1.0.0",
+                "os-tmpdir": "^1.0.0"
+              }
+            },
+            "path-is-absolute": {
+              "version": "1.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "process-nextick-args": {
+              "version": "2.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "rc": {
+              "version": "1.2.8",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "deep-extend": "^0.6.0",
+                "ini": "~1.3.0",
+                "minimist": "^1.2.0",
+                "strip-json-comments": "~2.0.1"
+              },
+              "dependencies": {
+                "minimist": {
+                  "version": "1.2.0",
+                  "bundled": true,
+                  "dev": true,
+                  "optional": true
+                }
+              }
+            },
+            "readable-stream": {
+              "version": "2.3.6",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+              }
+            },
+            "rimraf": {
+              "version": "2.6.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "glob": "^7.1.3"
+              }
+            },
+            "safe-buffer": {
+              "version": "5.1.2",
+              "bundled": true,
+              "dev": true
+            },
+            "safer-buffer": {
+              "version": "2.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "sax": {
+              "version": "1.2.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "semver": {
+              "version": "5.6.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "set-blocking": {
+              "version": "2.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "signal-exit": {
+              "version": "3.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "string-width": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
+              }
+            },
+            "string_decoder": {
+              "version": "1.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "safe-buffer": "~5.1.0"
+              }
+            },
+            "strip-ansi": {
+              "version": "3.0.1",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^2.0.0"
+              }
+            },
+            "strip-json-comments": {
+              "version": "2.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "tar": {
+              "version": "4.4.8",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "chownr": "^1.1.1",
+                "fs-minipass": "^1.2.5",
+                "minipass": "^2.3.4",
+                "minizlib": "^1.1.1",
+                "mkdirp": "^0.5.0",
+                "safe-buffer": "^5.1.2",
+                "yallist": "^3.0.2"
+              }
+            },
+            "util-deprecate": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "wide-align": {
+              "version": "1.1.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "string-width": "^1.0.2 || 2"
+              }
+            },
+            "wrappy": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true
+            },
+            "yallist": {
+              "version": "3.0.3",
+              "bundled": true,
+              "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
-        },
-        "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=",
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
           "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="
+            "pump": "^3.0.0"
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.0.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.5"
+              }
+            }
+          }
+        },
+        "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.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "dev": true,
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
         }
       }
     },
-    "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",
       "dev": true,
       "optional": true,
       "requires": {
-        "glob": "7.1.2",
-        "lodash": "4.17.5",
-        "scss-tokenizer": "0.2.3",
-        "yargs": "7.1.0"
+        "glob": "^7.0.0",
+        "lodash": "^4.0.0",
+        "scss-tokenizer": "^0.2.3",
+        "yargs": "^7.0.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=",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz",
+      "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==",
       "dev": true,
       "requires": {
-        "https-proxy-agent": "1.0.0"
+        "clone-deep": "^2.0.1",
+        "loader-utils": "^1.0.1",
+        "lodash.tail": "^4.1.1",
+        "neo-async": "^2.5.0",
+        "pify": "^3.0.0",
+        "semver": "^5.5.0"
       }
     },
     "sax": {
       "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==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+      "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+      "dev": true,
       "requires": {
-        "ajv": "6.3.0",
-        "ajv-keywords": "3.1.0"
+        "ajv": "^6.1.0",
+        "ajv-errors": "^1.0.0",
+        "ajv-keywords": "^3.1.0"
       }
     },
     "scss-tokenizer": {
       "dev": true,
       "optional": true,
       "requires": {
-        "js-base64": "2.4.3",
-        "source-map": "0.4.4"
+        "js-base64": "^2.1.8",
+        "source-map": "^0.4.2"
       },
       "dependencies": {
         "source-map": {
           "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"
+            "amdefine": ">=0.0.4"
           }
         }
       }
       "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=",
+      "version": "1.10.4",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz",
+      "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==",
       "dev": true,
       "requires": {
-        "node-forge": "0.7.1"
+        "node-forge": "0.7.5"
       }
     },
     "semver": {
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
       "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
     },
+    "semver-compare": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
+      "dev": true
+    },
     "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": "^5.3.0"
       }
     },
     "semver-intersect": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz",
-      "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz",
+      "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==",
       "dev": true,
       "requires": {
-        "semver": "5.5.0"
+        "semver": "^5.0.0"
       }
     },
     "send": {
       "version": "0.16.2",
       "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
       "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+      "dev": true,
       "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",
+        "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",
+        "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"
+        "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=="
+          "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+          "dev": true
         }
       }
     },
     "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=="
-        }
-      }
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.0.tgz",
+      "integrity": "sha512-AQxrNqu4EXWt03dJdgKXI+Au9+pvEuM5+Nk5g6+TmuxMCkEL03VhZ31HM+VKeaaZbFpDHaoSruiHq4PW9AIrOQ==",
+      "dev": true
     },
     "serve-index": {
       "version": "1.9.1",
       "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
       "dev": true,
       "requires": {
-        "accepts": "1.3.5",
+        "accepts": "~1.3.4",
         "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"
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "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==",
+      "dev": true,
       "requires": {
-        "encodeurl": "1.0.2",
-        "escape-html": "1.0.3",
-        "parseurl": "1.3.2",
+        "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="
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
     },
     "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="
+      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+      "dev": true
     },
     "set-value": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
       "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+      "dev": true,
       "requires": {
-        "extend-shallow": "2.0.1",
-        "is-extendable": "0.1.1",
-        "is-plain-object": "2.0.4",
-        "split-string": "3.1.0"
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.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"
+            "is-extendable": "^0.1.0"
           }
         }
       }
     "setimmediate": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
-      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
     },
     "setprototypeof": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
-      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+      "dev": true
     },
     "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==",
+      "dev": true,
       "requires": {
-        "inherits": "2.0.3",
-        "safe-buffer": "5.1.1"
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
       }
     },
     "shallow-clone": {
       "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"
+        "is-extendable": "^0.1.1",
+        "kind-of": "^5.0.0",
+        "mixin-object": "^2.0.1"
       },
       "dependencies": {
         "kind-of": {
         }
       }
     },
-    "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=",
+      "dev": true,
       "requires": {
-        "shebang-regex": "1.0.0"
+        "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="
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
     },
     "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"
+        "array-filter": "~0.0.0",
+        "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==",
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz",
+      "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==",
+      "dev": true,
       "requires": {
-        "glob": "7.1.2",
-        "interpret": "1.1.0",
-        "rechoir": "0.6.2"
+        "glob": "^7.0.0",
+        "interpret": "^1.0.0",
+        "rechoir": "^0.6.2"
       }
     },
+    "shellwords": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
+      "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+      "dev": true
+    },
     "signal-exit": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "dev": true
     },
-    "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"
+    "sisteransi": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz",
+      "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==",
+      "dev": true
+    },
+    "skmeans": {
+      "version": "0.9.7",
+      "resolved": "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz",
+      "integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg=="
+    },
+    "sl-browser-agent": {
+      "version": "1.0.170",
+      "resolved": "https://registry.npmjs.org/sl-browser-agent/-/sl-browser-agent-1.0.170.tgz",
+      "integrity": "sha512-roB2ZAf10LuSdMUBVCfOPoFH6DGId8zuO/UW2Wl7ZlaLkhS/bfOB9vFaGR01UnT9UxK86V+H6mI/Ix0JukSXpw==",
+      "requires": {
+        "source-map": "^0.5.6"
+      }
+    },
+    "sl-cia": {
+      "version": "2.1.274",
+      "resolved": "https://registry.npmjs.org/sl-cia/-/sl-cia-2.1.274.tgz",
+      "integrity": "sha512-UzoNc9vInZPMVpQA1Zq3/iNFZNm5sDfj/RhInAc8Xrb5VWAjxMNsOYML3go7yqxVng5yQ504uYfHpXjYKEyYdw==",
+      "requires": {
+        "ast-traverse": "^0.1.1",
+        "async": "^2.6.0",
+        "babel-generator": "^6.25.0",
+        "babylon": "^6.17.4",
+        "bunyan": "^1.8.4",
+        "bunyan-blackhole": "^1.1.1",
+        "bunyan-format": "^0.2.1",
+        "escodegen": "^1.9.0",
+        "esprima": "^4.0.0",
+        "fileset": "^2.0.3",
+        "glob": "^5.0.15",
+        "is-valid-path": "^0.1.1",
+        "istanbul-lib-instrument": "^1.9.1",
+        "jwt-decode": "^2.1.0",
+        "md5": "^2.0.0",
+        "mkdirp": "^0.5.1",
+        "nopt": "^3.0.4",
+        "nopt-usage": "^0.1.0",
+        "once": "^1.4.0",
+        "parse-diff": "^0.3.0",
+        "promise": "^7.0.4",
+        "read-json-sync": "^1.1.0",
+        "sl-esprima-ast-utils": "^0.0.7",
+        "sl-js-infra": "^1.0.115",
+        "source-map": "^0.5.7",
+        "util": "^0.10.3",
+        "uuid": "^2.0.1"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "5.0.15",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+          "requires": {
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "2 || 3",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "nopt": {
+          "version": "3.0.6",
+          "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+          "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+          "requires": {
+            "abbrev": "1"
+          }
+        },
+        "uuid": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+          "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho="
+        }
       }
     },
-    "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,
+    "sl-esprima-ast-utils": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/sl-esprima-ast-utils/-/sl-esprima-ast-utils-0.0.7.tgz",
+      "integrity": "sha1-N76P/OEry3x/0zBBG855rz3y0mg=",
       "requires": {
-        "requestretry": "1.13.0"
+        "archy": "^1.0.0",
+        "cssauron-falafel": "^1.2.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="
+        }
+      }
+    },
+    "sl-js-infra": {
+      "version": "1.0.119",
+      "resolved": "https://registry.npmjs.org/sl-js-infra/-/sl-js-infra-1.0.119.tgz",
+      "integrity": "sha512-3MlitHbJ32cjNE4nrqhAoKRzsAxpBuuvRSs+lCi3/ry34vlndjYFE6pReqb+MChc2qvBmXVycL3wUq08DMghPg==",
+      "requires": {
+        "@types/bunyan": "0.0.36",
+        "@types/request": "^0.0.45",
+        "@types/uuid": "^3.4.3",
+        "bunyan": "^1.8.4",
+        "bunyan-format": "^0.2.1",
+        "find-up": "^3.0.0",
+        "gitignore-parser": "0.0.2",
+        "jwt-decode": "^2.2.0",
+        "request": "^2.80.0",
+        "source-map": "^0.6.1",
+        "uuid": "^3.1.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
+          "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ=="
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        }
+      }
+    },
+    "sl-node": {
+      "version": "2.0.122",
+      "resolved": "https://registry.npmjs.org/sl-node/-/sl-node-2.0.122.tgz",
+      "integrity": "sha512-k9p43lfm3AwNt4L1hfedd/0wdzlFiM0Loxwi+hGcz4WBqwGBBtaPXdArAyk3FK4+s+wuo6HWmEx/1/0n3lh6zg==",
+      "requires": {
+        "async": "^2.1.4",
+        "bunyan": "^1.8.10",
+        "bunyan-format": "^0.2.1",
+        "commander": "^2.9.0",
+        "jwt-decode": "^2.2.0",
+        "needle": "^1.0.0",
+        "nopt": "^3.0.4",
+        "nopt-usage": "^0.1.0",
+        "promise": "^7.0.4",
+        "shell-quote": "^1.6.1"
+      },
+      "dependencies": {
+        "nopt": {
+          "version": "3.0.6",
+          "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+          "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+          "requires": {
+            "abbrev": "1"
+          }
+        }
+      }
+    },
+    "sl-node-mocha": {
+      "version": "1.0.27",
+      "resolved": "https://registry.npmjs.org/sl-node-mocha/-/sl-node-mocha-1.0.27.tgz",
+      "integrity": "sha1-V5DbaYtbfJCZi8x1f+T9htuEIh8="
+    },
+    "sl-node-mocha2": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/sl-node-mocha2/-/sl-node-mocha2-2.0.1.tgz",
+      "integrity": "sha1-kJJcQZ2vN2apwth0T06m4Ms24to="
+    },
+    "sl-node2": {
+      "version": "3.0.165",
+      "resolved": "https://registry.npmjs.org/sl-node2/-/sl-node2-3.0.165.tgz",
+      "integrity": "sha512-tStrBzldG++sMeY06/mWVmmkywwDNcy4hTrHC4x0Wnm/SGiOJ4F2kMRAB8IBn0KHrtzoG/36US7tFoB6W4xdMw==",
+      "requires": {
+        "@types/jwt-decode": "^1.4.28",
+        "@types/request": "^0.0.45",
+        "bunyan": "^1.8.8",
+        "bunyan-format": "^0.2.1",
+        "commander": "^2.9.0",
+        "cookie": "^0.3.1",
+        "jwt-decode": "^2.1.0",
+        "nyc": "^12.0.1",
+        "object-assign": "^4.1.1",
+        "promise": "^7.0.4",
+        "request": "^2.80.0",
+        "shell-quote": "^1.6.1",
+        "sl-js-infra": "^1.0.114"
       }
     },
     "slash": {
       "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
       "dev": true
     },
+    "slnodejs": {
+      "version": "2.1.124",
+      "resolved": "https://registry.npmjs.org/slnodejs/-/slnodejs-2.1.124.tgz",
+      "integrity": "sha512-qR5hhUXjVdcwVMo/WdCIvuLaEaAmhNtCkMtY7/NMaA8nDckShQt0y6sw/L8MiKQXzFbQaJNTjumUhEwZlpR2wg==",
+      "requires": {
+        "@types/sinon": "^2.3.3",
+        "bunyan": "^1.8.8",
+        "bunyan-format": "^0.2.1",
+        "commander": "^2.9.0",
+        "convert-source-map": "^1.4.0",
+        "esprima": "^4.0.0",
+        "jwt-decode": "^2.1.0",
+        "loader-utils": "^1.1.0",
+        "object-assign": "^4.1.1",
+        "rimraf": "^2.6.2",
+        "semver": "^5.3.0",
+        "sl-browser-agent": "1.0.170",
+        "sl-cia": "2.1.274",
+        "sl-js-infra": "^1.0.113",
+        "sl-node": "^2.0.122",
+        "sl-node-mocha": "^1.0.25",
+        "sl-node-mocha2": "^2.0.0",
+        "sl-node2": "^3.0.163",
+        "version-exists": "0.0.3"
+      },
+      "dependencies": {
+        "@types/sinon": {
+          "version": "2.3.7",
+          "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-2.3.7.tgz",
+          "integrity": "sha512-w+LjztaZbgZWgt/y/VMP5BUAWLtSyoIJhXyW279hehLPyubDoBNwvhcj3WaSptcekuKYeTCVxrq60rdLc6ImJA=="
+        }
+      }
+    },
     "smart-buffer": {
-      "version": "1.1.15",
-      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz",
-      "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.1.tgz",
+      "integrity": "sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==",
       "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==",
+      "dev": true,
       "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"
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "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=",
+          "dev": true,
           "requires": {
-            "is-descriptor": "0.1.6"
+            "is-descriptor": "^0.1.0"
           }
         },
         "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-extendable": "^0.1.0"
           }
         },
         "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"
+            "kind-of": "^3.0.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-buffer": "^1.1.5"
               }
             }
           }
           "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"
+            "kind-of": "^3.0.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-buffer": "^1.1.5"
               }
             }
           }
           "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"
+            "is-accessor-descriptor": "^0.1.6",
+            "is-data-descriptor": "^0.1.4",
+            "kind-of": "^5.0.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=="
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
         }
       }
     },
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
       "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "dev": true,
       "requires": {
-        "define-property": "1.0.0",
-        "isobject": "3.0.1",
-        "snapdragon-util": "3.0.1"
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "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=",
+          "dev": true,
           "requires": {
-            "is-descriptor": "1.0.2"
+            "is-descriptor": "^1.0.0"
           }
         },
         "isobject": {
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
         }
       }
     },
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
       "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "dev": true,
       "requires": {
-        "kind-of": "3.2.2"
+        "kind-of": "^3.2.0"
       }
     },
     "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"
+        "hoek": "2.x.x"
       }
     },
-    "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=",
+    "sockjs": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
+      "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
       "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"
+        "faye-websocket": "^0.10.0",
+        "uuid": "^3.0.1"
       }
     },
-    "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==",
+    "sockjs-client": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
+      "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==",
       "dev": true,
       "requires": {
-        "component-emitter": "1.2.1",
-        "debug": "3.1.0",
-        "has-binary2": "1.0.2",
-        "isarray": "2.0.1"
+        "debug": "^3.2.5",
+        "eventsource": "^1.0.7",
+        "faye-websocket": "~0.11.1",
+        "inherits": "^2.0.3",
+        "json3": "^3.3.2",
+        "url-parse": "^1.4.3"
       },
       "dependencies": {
         "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "ms": "^2.1.1"
           }
         },
-        "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=",
+          "dev": true,
           "requires": {
-            "websocket-driver": "0.7.0"
+            "websocket-driver": ">=0.5.1"
           }
+        },
+        "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==",
+          "dev": true
         }
       }
     },
     "socks": {
-      "version": "1.1.10",
-      "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz",
-      "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=",
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.2.tgz",
+      "integrity": "sha512-g6wjBnnMOZpE0ym6e0uHSddz9p3a+WsBaaYQaBaSCJYvrC4IXykQR9MNGjLQf38e9iIIhp3b1/Zk8YZI3KGJ0Q==",
       "dev": true,
       "requires": {
-        "ip": "1.1.5",
-        "smart-buffer": "1.1.15"
+        "ip": "^1.1.5",
+        "smart-buffer": "^4.0.1"
       }
     },
     "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==",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz",
+      "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==",
       "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"
+        "agent-base": "~4.2.0",
+        "socks": "~2.2.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=="
+      "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==",
+      "dev": true
     },
     "source-map": {
       "version": "0.5.7",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
       "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
     },
+    "source-map-loader": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz",
+      "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==",
+      "dev": true,
+      "requires": {
+        "async": "^2.5.0",
+        "loader-utils": "^1.1.0"
+      }
+    },
     "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==",
+      "dev": true,
       "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"
+        "atob": "^2.0.0",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
       }
     },
     "source-map-support": {
       "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
       "dev": true,
       "requires": {
-        "source-map": "0.5.7"
+        "source-map": "^0.5.6"
       }
     },
     "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="
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
     },
-    "sparkles": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
-      "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+    "sourcemap-codec": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz",
+      "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==",
       "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==",
+      "dev": true,
       "requires": {
-        "spdx-expression-parse": "3.0.0",
-        "spdx-license-ids": "3.0.0"
+        "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=="
+      "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
+      "dev": true
     },
     "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==",
+      "dev": true,
       "requires": {
-        "spdx-exceptions": "2.1.0",
-        "spdx-license-ids": "3.0.0"
+        "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=="
+      "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
+      "dev": true
     },
     "spdy": {
       "version": "3.4.7",
       "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"
+        "debug": "^2.6.8",
+        "handle-thing": "^1.2.5",
+        "http-deceiver": "^1.2.7",
+        "safe-buffer": "^5.0.1",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^2.0.18"
       }
     },
     "spdy-transport": {
-      "version": "2.0.20",
-      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz",
-      "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz",
+      "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==",
       "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"
+        "debug": "^2.6.8",
+        "detect-node": "^2.0.3",
+        "hpack.js": "^2.1.6",
+        "obuf": "^1.1.1",
+        "readable-stream": "^2.2.9",
+        "safe-buffer": "^5.0.1",
+        "wbuf": "^1.7.2"
+      }
+    },
+    "speed-measure-webpack-plugin": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.3.tgz",
+      "integrity": "sha512-p+taQ69VkRUXYMoZOx2nxV/Tz8tt79ahctoZJyJDHWP7fEYvwFNf5Pd73k5kZ6auu0pTsPNLEUwWpM8mCk85Zw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.1"
       }
     },
     "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==",
+      "dev": true,
       "requires": {
-        "extend-shallow": "3.0.2"
+        "extend-shallow": "^3.0.0"
       }
     },
     "sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
     },
     "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"
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "tweetnacl": "~0.14.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
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
         }
       }
     },
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
       "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
+      "dev": true,
       "requires": {
-        "safe-buffer": "5.1.1"
+        "safe-buffer": "^5.1.1"
       }
     },
+    "stack-utils": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
+      "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
+      "dev": true
+    },
     "static-extend": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
       "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
       "requires": {
-        "define-property": "0.2.5",
-        "object-copy": "0.1.0"
+        "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=",
+          "dev": true,
           "requires": {
-            "is-descriptor": "0.1.6"
+            "is-descriptor": "^0.1.0"
           }
         },
         "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"
+            "kind-of": "^3.0.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-buffer": "^1.1.5"
               }
             }
           }
           "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"
+            "kind-of": "^3.0.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-buffer": "^1.1.5"
               }
             }
           }
           "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"
+            "is-accessor-descriptor": "^0.1.6",
+            "is-data-descriptor": "^0.1.4",
+            "kind-of": "^5.0.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=="
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
         }
       }
     },
+    "stats-webpack-plugin": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz",
+      "integrity": "sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.4"
+      }
+    },
     "statuses": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-      "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
+      "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+      "dev": true
     },
     "stdout-stream": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz",
-      "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=",
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
+      "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
       "dev": true,
       "optional": true,
       "requires": {
-        "readable-stream": "2.3.5"
+        "readable-stream": "^2.0.1"
       }
     },
+    "stealthy-require": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+      "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
+      "dev": true
+    },
+    "stream-blackhole": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/stream-blackhole/-/stream-blackhole-1.0.3.tgz",
+      "integrity": "sha1-b8LiwunZ/ea+jGjT24jeCYAuTWM="
+    },
     "stream-browserify": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
       "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+      "dev": true,
       "requires": {
-        "inherits": "2.0.3",
-        "readable-stream": "2.3.5"
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
       }
     },
     "stream-each": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz",
-      "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==",
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+      "dev": true,
       "requires": {
-        "end-of-stream": "1.4.1",
-        "stream-shift": "1.0.0"
+        "end-of-stream": "^1.1.0",
+        "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==",
+      "dev": true,
       "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"
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.3",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
       }
     },
     "stream-shift": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
-      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
+      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+      "dev": true
     },
     "stream-to-observable": {
       "version": "0.1.0",
       "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==",
+    "string-length": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz",
+      "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=",
       "dev": true,
       "requires": {
-        "date-format": "1.2.0",
-        "debug": "3.1.0",
-        "mkdirp": "0.5.1",
-        "readable-stream": "2.3.5"
+        "astral-regex": "^1.0.0",
+        "strip-ansi": "^4.0.0"
       },
       "dependencies": {
-        "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "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": {
-            "ms": "2.0.0"
+            "ansi-regex": "^3.0.0"
           }
         }
       }
     },
-    "strict-uri-encode": {
+    "string-similarity": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
-      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
+      "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-1.1.0.tgz",
+      "integrity": "sha1-PGZJiFikZex8QMfYFzm72ZWQSRQ=",
+      "requires": {
+        "lodash": "^4.13.1"
+      }
     },
     "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"
+        "code-point-at": "^1.0.0",
+        "is-fullwidth-code-point": "^1.0.0",
+        "strip-ansi": "^3.0.0"
       }
     },
     "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=",
+      "dev": true,
       "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"
+        "define-properties": "^1.1.2",
+        "es-abstract": "^1.4.3",
+        "function-bind": "^1.0.2"
       }
     },
     "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==",
+      "dev": true,
       "requires": {
-        "safe-buffer": "5.1.1"
+        "safe-buffer": "~5.1.0"
       }
     },
     "stringstream": {
       "version": "0.0.5",
       "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
-      "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
-      "dev": true
+      "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
     },
     "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"
+        "ansi-regex": "^2.0.0"
       }
     },
     "strip-bom": {
       "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
       "dev": true,
       "requires": {
-        "is-utf8": "0.2.1"
+        "is-utf8": "^0.2.0"
       }
     },
     "strip-eof": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
     },
     "strip-indent": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
       "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
       "dev": true,
+      "optional": true,
       "requires": {
-        "get-stdin": "4.0.1"
+        "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
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
     },
     "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==",
+      "version": "0.23.1",
+      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
+      "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==",
       "dev": true,
       "requires": {
-        "loader-utils": "1.1.0",
-        "schema-utils": "0.3.0"
+        "loader-utils": "^1.1.0",
+        "schema-utils": "^1.0.0"
+      }
+    },
+    "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.x",
+        "debug": "*",
+        "glob": "7.0.x",
+        "mkdirp": "0.5.x",
+        "sax": "0.5.x",
+        "source-map": "0.1.x"
       },
       "dependencies": {
-        "ajv": {
-          "version": "5.5.2",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+        "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.4",
+            "inherits": "2",
+            "minimatch": "^3.0.2",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "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": {
-            "co": "4.6.0",
-            "fast-deep-equal": "1.1.0",
-            "fast-json-stable-stringify": "2.0.0",
-            "json-schema-traverse": "0.3.1"
+            "amdefine": ">=0.0.4"
           }
+        }
+      }
+    },
+    "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.0.2",
+        "lodash.clonedeep": "^4.5.0",
+        "when": "~3.6.x"
+      }
+    },
+    "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"
+      }
+    },
+    "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=="
+    },
+    "symbol-tree": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
+      "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=",
+      "dev": true
+    },
+    "tapable": {
+      "version": "0.2.8",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz",
+      "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=",
+      "dev": true
+    },
+    "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": "*",
+        "fstream": "^1.0.2",
+        "inherits": "2"
+      }
+    },
+    "terminal-banner": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/terminal-banner/-/terminal-banner-1.1.0.tgz",
+      "integrity": "sha512-A70B8Io5gGOTKQuoqU6LUPLouNd9DvFLgw3cPh6bfrQjdy7HWW1t04VJfQwjTnygTVDX0xremaj1cg3SQaCGyg==",
+      "dev": true
+    },
+    "terser": {
+      "version": "3.13.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-3.13.1.tgz",
+      "integrity": "sha512-ogyZye4DFqOtMzT92Y3Nxxw8OvXmL39HOALro4fc+EUYFFF9G/kk0znkvwMz6PPYgBtdKAodh3FPR70eugdaQA==",
+      "dev": true,
+      "requires": {
+        "commander": "~2.17.1",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.6"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.17.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+          "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+          "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
         },
-        "schema-utils": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
-          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+        "source-map-support": {
+          "version": "0.5.9",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
+          "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
           "dev": true,
           "requires": {
-            "ajv": "5.5.2"
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.0"
           }
         }
       }
     },
-    "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"
+    "terser-webpack-plugin": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz",
+      "integrity": "sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==",
+      "dev": true,
+      "requires": {
+        "cacache": "^11.0.2",
+        "find-cache-dir": "^2.0.0",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^1.4.0",
+        "source-map": "^0.6.1",
+        "terser": "^3.8.1",
+        "webpack-sources": "^1.1.0",
+        "worker-farm": "^1.5.2"
       },
       "dependencies": {
+        "cacache": {
+          "version": "11.3.2",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz",
+          "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.3",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.3",
+            "graceful-fs": "^4.1.15",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.2",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "find-cache-dir": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz",
+          "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^1.0.0",
+            "pkg-dir": "^3.0.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
         "glob": {
-          "version": "7.0.6",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
-          "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
+          "version": "7.1.3",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+          "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "graceful-fs": {
+          "version": "4.1.15",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+          "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+          "dev": true
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "mississippi": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+          "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+          "dev": true,
+          "requires": {
+            "concat-stream": "^1.5.0",
+            "duplexify": "^3.4.2",
+            "end-of-stream": "^1.1.0",
+            "flush-write-stream": "^1.0.0",
+            "from2": "^2.1.0",
+            "parallel-transform": "^1.1.0",
+            "pump": "^3.0.0",
+            "pumpify": "^1.3.3",
+            "stream-each": "^1.1.0",
+            "through2": "^2.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
+          "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+          "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0"
+          }
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
           "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"
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
           }
         },
         "source-map": {
-          "version": "0.1.43",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
-          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
           "dev": true,
           "requires": {
-            "amdefine": "1.0.1"
+            "figgy-pudding": "^3.5.1"
           }
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
+          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
+          "dev": true
         }
       }
     },
-    "stylus-loader": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz",
-      "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==",
+    "test-exclude": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.1.0.tgz",
+      "integrity": "sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA==",
       "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"
+        "arrify": "^1.0.1",
+        "minimatch": "^3.0.4",
+        "read-pkg-up": "^4.0.0",
+        "require-main-filename": "^1.0.1"
       },
       "dependencies": {
-        "sax": {
-          "version": "1.2.4",
-          "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-          "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
         },
-        "xml2js": {
-          "version": "0.4.17",
-          "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz",
-          "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=",
+        "load-json-file": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+          "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+          "dev": true,
           "requires": {
-            "sax": "1.2.4",
-            "xmlbuilder": "4.2.1"
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^4.0.0",
+            "pify": "^3.0.0",
+            "strip-bom": "^3.0.0"
           }
         },
-        "xmlbuilder": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz",
-          "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=",
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
           "requires": {
-            "lodash": "4.17.5"
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
           }
-        }
-      }
-    },
-    "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=",
+        "p-limit": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz",
+          "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==",
+          "dev": true,
           "requires": {
-            "argparse": "1.0.10",
-            "esprima": "2.7.3"
+            "p-try": "^2.0.0"
           }
         },
-        "sax": {
-          "version": "1.2.4",
-          "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-          "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+          "dev": true
+        },
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        },
+        "read-pkg": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+          "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^4.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^3.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
+          "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
+          "dev": true,
+          "requires": {
+            "find-up": "^3.0.0",
+            "read-pkg": "^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
         }
       }
     },
-    "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==",
+    "throat": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
+      "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=",
       "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=",
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
+      "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=",
       "dev": true
     },
     "through": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
       "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+      "dev": true,
       "requires": {
-        "readable-stream": "2.3.5",
-        "xtend": "4.0.1"
+        "readable-stream": "^2.1.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=",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
+      "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==",
       "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="
+    "timed-out": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+      "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
     },
     "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==",
+      "dev": true,
       "requires": {
-        "setimmediate": "1.0.5"
+        "setimmediate": "^1.0.4"
       }
     },
-    "timespan": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz",
-      "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=",
-      "dev": true,
-      "optional": true
+    "tinyqueue": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-1.2.3.tgz",
+      "integrity": "sha512-Qz9RgWuO9l8lT+Y9xvbzhPT2efIUIFd69N7eF7tJ9lnQl0iLj1M7peK7IoUGZL9DJHw9XftqLreccfxcQgYLxA=="
     },
     "tmp": {
-      "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
-      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "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"
+        "os-tmpdir": "~1.0.1"
       }
     },
-    "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=",
+    "tmpl": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
+      "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
       "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="
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+      "dev": true
     },
     "to-fast-properties": {
       "version": "1.0.3",
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
       "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
       "requires": {
-        "kind-of": "3.2.2"
+        "kind-of": "^3.0.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==",
+      "dev": true,
       "requires": {
-        "define-property": "2.0.2",
-        "extend-shallow": "3.0.2",
-        "regex-not": "1.0.2",
-        "safe-regex": "1.1.0"
+        "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=",
+      "dev": true,
       "requires": {
-        "is-number": "3.0.0",
-        "repeat-string": "1.6.1"
+        "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=",
+          "dev": true,
           "requires": {
-            "kind-of": "3.2.2"
+            "kind-of": "^3.0.2"
           }
         }
       }
     },
-    "toposort": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz",
-      "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw="
+    "topojson-client": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.0.0.tgz",
+      "integrity": "sha1-H5kpOnfvQqRI0DKoGqmCtz82DS8=",
+      "requires": {
+        "commander": "2"
+      }
+    },
+    "topojson-server": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/topojson-server/-/topojson-server-3.0.0.tgz",
+      "integrity": "sha1-N4546Hw5cqe1vixdYENptrrmnF4=",
+      "requires": {
+        "commander": "2"
+      }
     },
     "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"
+        "punycode": "^1.4.1"
       }
     },
-    "traverse": {
-      "version": "0.6.6",
-      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
-      "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc="
+    "tr46": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+      "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+          "dev": true
+        }
+      }
     },
     "tree-kill": {
       "version": "1.2.0",
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
       "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
-      "dev": true
+      "dev": true,
+      "optional": 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
+      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
     },
     "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=",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
+      "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
       "dev": true,
       "optional": true,
       "requires": {
-        "glob": "6.0.4"
+        "glob": "^7.1.2"
+      }
+    },
+    "ts-jest": {
+      "version": "23.1.4",
+      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-23.1.4.tgz",
+      "integrity": "sha512-9rCSxbWfoZxxeXnSoEIzRNr9hDIQ8iEJAWmSRsWhDHDT8OeuGfURhJQUE8jtJlkyEygs6rngH8RYtHz9cfjmEA==",
+      "requires": {
+        "closest-file-data": "^0.1.4",
+        "fs-extra": "6.0.1",
+        "json5": "^0.5.0",
+        "lodash": "^4.17.10"
       },
       "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"
-          }
+        "lodash": {
+          "version": "4.17.11",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
         }
       }
     },
       "integrity": "sha512-4g8BF3gKWBHeM1jAFmMPHofuJlwTUU4iHJ0i3mwXRHwy74RU6VBOgl9kDVMGpapvGcMlVqV5G6v9XmV66Qqd7w==",
       "dev": true,
       "requires": {
-        "chalk": "2.4.1",
-        "enhanced-resolve": "3.4.1",
-        "loader-utils": "1.1.0",
-        "semver": "5.5.0"
+        "chalk": "^2.3.0",
+        "enhanced-resolve": "^3.0.0",
+        "loader-utils": "^1.0.2",
+        "semver": "^5.0.1"
       },
       "dependencies": {
         "chalk": {
           "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
           "dev": true,
           "requires": {
-            "ansi-styles": "3.2.1",
-            "escape-string-regexp": "1.0.5",
-            "supports-color": "5.4.0"
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
           }
         },
         "has-flag": {
           "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
           "dev": true,
           "requires": {
-            "has-flag": "3.0.0"
+            "has-flag": "^3.0.0"
           }
         }
       }
     },
+    "ts-mockito": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.3.1.tgz",
+      "integrity": "sha512-chcKw0sTApwJxTyKhzbWxI4BTUJ6RStZKUVh2/mfwYqFS09PYy5pvdXZwG35QSkqT5pkdXZlYKBX196RRvEZdQ==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.5"
+      }
+    },
     "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"
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-5.0.1.tgz",
+      "integrity": "sha512-XK7QmDcNHVmZkVtkiwNDWiERRHPyU8nBqZB1+iv2UhOG0q3RQ9HsZ2CMqISlFbxjrYFGfG2mX7bW4dAyxBVzUw==",
+      "dev": true,
+      "requires": {
+        "arrify": "^1.0.0",
+        "chalk": "^2.3.0",
+        "diff": "^3.1.0",
+        "make-error": "^1.1.1",
+        "minimist": "^1.2.0",
+        "mkdirp": "^0.5.1",
+        "source-map-support": "^0.5.3",
+        "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==",
+          "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.3.0"
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
           }
         },
         "has-flag": {
           "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==",
+          "version": "0.5.9",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
+          "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
           "dev": true,
           "requires": {
-            "source-map": "0.6.1"
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.0"
           }
         },
         "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==",
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
           "dev": true,
           "requires": {
-            "has-flag": "3.0.0"
+            "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"
+      "version": "5.12.0",
+      "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.0.tgz",
+      "integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "^6.22.0",
+        "builtin-modules": "^1.1.1",
+        "chalk": "^2.3.0",
+        "commander": "^2.12.1",
+        "diff": "^3.2.0",
+        "glob": "^7.1.1",
+        "js-yaml": "^3.7.0",
+        "minimatch": "^3.0.4",
+        "resolve": "^1.3.2",
+        "semver": "^5.3.0",
+        "tslib": "^1.8.0",
+        "tsutils": "^2.27.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==",
+          "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.3.0"
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
           }
         },
         "has-flag": {
           "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==",
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
           "dev": true,
           "requires": {
-            "has-flag": "3.0.0"
+            "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==",
+      "version": "2.29.0",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+      "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
       "dev": true,
       "requires": {
-        "tslib": "1.9.0"
+        "tslib": "^1.8.1"
       }
     },
     "tty-browserify": {
       "version": "0.0.0",
       "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
-      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "dev": true
     },
     "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"
+        "safe-buffer": "^5.0.1"
       }
     },
+    "turf-jsts": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/turf-jsts/-/turf-jsts-1.2.3.tgz",
+      "integrity": "sha512-Ja03QIJlPuHt4IQ2FfGex4F4JAr8m3jpaHbFbQrgwr7s7L6U8ocrHiF3J1+wf9jzhGKxvDeaCAnGDot8OjGFyA=="
+    },
     "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
     },
+    "two-product": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/two-product/-/two-product-1.0.2.tgz",
+      "integrity": "sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo="
+    },
+    "two-sum": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/two-sum/-/two-sum-1.0.0.tgz",
+      "integrity": "sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q="
+    },
     "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"
+        "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==",
+      "dev": true,
       "requires": {
         "media-typer": "0.3.0",
-        "mime-types": "2.1.18"
+        "mime-types": "~2.1.18"
       }
     },
     "typedarray": {
       "version": "0.0.6",
       "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
     },
     "typescript": {
-      "version": "2.5.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz",
-      "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==",
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz",
+      "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==",
       "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==",
+    "uglify-es": {
+      "version": "3.3.9",
+      "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
+      "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
+      "dev": true,
       "requires": {
-        "commander": "2.15.0",
-        "source-map": "0.6.1"
+        "commander": "~2.13.0",
+        "source-map": "~0.6.1"
       },
       "dependencies": {
+        "commander": {
+          "version": "2.13.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
+          "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
+          "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=="
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
         }
       }
     },
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
       "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+      "dev": true,
       "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"
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz",
+      "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==",
+      "dev": true,
+      "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.4",
+        "webpack-sources": "^1.1.0",
+        "worker-farm": "^1.5.2"
       },
       "dependencies": {
-        "commander": {
-          "version": "2.13.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
-          "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA=="
+        "schema-utils": {
+          "version": "0.4.7",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
+          "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-keywords": "^3.1.0"
+          }
         },
         "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"
-          }
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
         }
       }
     },
-    "ultron": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
-      "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+    "unicode-canonical-property-names-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
       "dev": true
     },
-    "underscore": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
-      "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
+    "unicode-match-property-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+      "dev": true,
+      "requires": {
+        "unicode-canonical-property-names-ecmascript": "^1.0.4",
+        "unicode-property-aliases-ecmascript": "^1.0.4"
+      }
+    },
+    "unicode-match-property-value-ecmascript": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz",
+      "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==",
+      "dev": true
+    },
+    "unicode-property-aliases-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==",
       "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=",
+      "dev": true,
       "requires": {
-        "arr-union": "3.1.0",
-        "get-value": "2.0.6",
-        "is-extendable": "0.1.1",
-        "set-value": "0.4.3"
+        "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=",
+          "dev": true,
           "requires": {
-            "is-extendable": "0.1.1"
+            "is-extendable": "^0.1.0"
           }
         },
         "set-value": {
           "version": "0.4.3",
           "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
           "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+          "dev": true,
           "requires": {
-            "extend-shallow": "2.0.1",
-            "is-extendable": "0.1.1",
-            "is-plain-object": "2.0.4",
-            "to-object-path": "0.3.0"
+            "extend-shallow": "^2.0.1",
+            "is-extendable": "^0.1.1",
+            "is-plain-object": "^2.0.1",
+            "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=",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "dev": true,
       "requires": {
-        "unique-slug": "2.0.0"
+        "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=",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
+      "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==",
+      "dev": true,
       "requires": {
-        "imurmurhash": "0.1.4"
+        "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
+      "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
     },
     "unpipe": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "dev": true
     },
     "unset-value": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
       "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
       "requires": {
-        "has-value": "0.3.1",
-        "isobject": "3.0.1"
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
       },
       "dependencies": {
         "has-value": {
           "version": "0.3.1",
           "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
           "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
           "requires": {
-            "get-value": "2.0.6",
-            "has-values": "0.1.4",
-            "isobject": "2.1.0"
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
           },
           "dependencies": {
             "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"
               }
         "has-values": {
           "version": "0.1.4",
           "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
         },
         "isobject": {
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
         }
       }
     },
+    "unzip-response": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+      "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
+    },
     "upath": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz",
-      "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw=="
+      "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==",
+      "dev": true
     },
-    "upper-case": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
-      "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg="
+    "uri-js": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+          "dev": true
+        }
+      }
     },
     "urix": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
     },
     "url": {
       "version": "0.11.0",
       "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
       "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "dev": true,
       "requires": {
         "punycode": "1.3.2",
         "querystring": "0.2.0"
         "punycode": {
           "version": "1.3.2",
           "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+          "dev": true
         }
       }
     },
-    "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==",
+    "url-parse": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz",
+      "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==",
+      "dev": true,
       "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"
-          }
-        }
+        "querystringify": "^2.0.0",
+        "requires-port": "^1.0.0"
       }
     },
-    "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==",
+    "url-parse-lax": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+      "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
       "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="
-        }
+        "prepend-http": "^1.0.1"
       }
     },
     "use": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
       "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+      "dev": true,
       "requires": {
-        "kind-of": "6.0.2"
+        "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=="
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
         }
       }
     },
     "util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
     },
-    "utila": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
-      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
+    "util.promisify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+      "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.2",
+        "object.getownpropertydescriptors": "^2.0.3"
+      }
     },
     "utils-merge": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "dev": true
     },
     "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==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "validate-npm-package-name": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
+      "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
+      "dev": true,
       "requires": {
-        "spdx-correct": "3.0.0",
-        "spdx-expression-parse": "3.0.0"
+        "builtins": "^1.0.3"
       }
     },
     "vary": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "dev": true
     },
-    "velocity-animate": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/velocity-animate/-/velocity-animate-1.5.1.tgz",
-      "integrity": "sha512-VJ3csMz5zP1ifkbBlsNYpxnoWkPHfVRQ8tUongS78W5DxSGHB68pjYHDTgUYBkVM7P/HpYdVukgVUFcxjr1gGg=="
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+        }
+      }
     },
-    "velocity-react": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/velocity-react/-/velocity-react-1.3.3.tgz",
-      "integrity": "sha1-1tRyds/Ivip1Yjh5sgFArFjBuCs=",
+    "version-exists": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/version-exists/-/version-exists-0.0.3.tgz",
+      "integrity": "sha1-Lub+LIpTy9X5F6hSHpiyDs9668k=",
       "requires": {
-        "lodash": "3.10.1",
-        "prop-types": "15.6.1",
-        "react-transition-group": "1.2.1",
-        "velocity-animate": "1.5.1"
+        "args": "2.6.1",
+        "chalk": "1.1.3",
+        "node-fetch": "1.6.3",
+        "npm-name": "3.0.0"
       },
       "dependencies": {
-        "lodash": {
-          "version": "3.10.1",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
+        "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": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "node-fetch": {
+          "version": "1.6.3",
+          "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz",
+          "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=",
+          "requires": {
+            "encoding": "^0.1.11",
+            "is-stream": "^1.0.1"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
         }
       }
     },
-    "vendors": {
+    "vm-browserify": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+      "dev": true,
+      "requires": {
+        "indexof": "0.0.1"
+      }
+    },
+    "w3c-hr-time": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz",
-      "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI="
+      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz",
+      "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=",
+      "dev": true,
+      "requires": {
+        "browser-process-hrtime": "^0.1.2"
+      }
     },
-    "verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+    "walker": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
+      "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
       "dev": true,
       "requires": {
-        "assert-plus": "1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "1.3.0"
+        "makeerror": "1.0.x"
+      }
+    },
+    "wallaby-webpack": {
+      "version": "3.9.11",
+      "resolved": "https://registry.npmjs.org/wallaby-webpack/-/wallaby-webpack-3.9.11.tgz",
+      "integrity": "sha512-V96IfgtFIpt03ZAyRUD/Az63rkIwWSdID88cMKS+4S0iWfyDyxXO7FnCPqBSRZ8/5V+5f1PyT3jXXSt5eTXNdQ==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.3",
+        "lodash": "^4.17.10",
+        "minimatch": "3.0.3"
       },
       "dependencies": {
-        "assert-plus": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+        "lodash": {
+          "version": "4.17.10",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
           "dev": true
+        },
+        "minimatch": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+          "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "^1.0.0"
+          }
         }
       }
     },
-    "vinyl": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
-      "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+    "watch": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz",
+      "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=",
       "dev": true,
       "requires": {
-        "clone": "1.0.3",
-        "clone-stats": "0.0.1",
-        "replace-ext": "0.0.1"
+        "exec-sh": "^0.2.0",
+        "minimist": "^1.2.0"
       },
       "dependencies": {
-        "clone": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
-          "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
           "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==",
+      "dev": true,
       "requires": {
-        "chokidar": "2.0.2",
-        "graceful-fs": "4.1.11",
-        "neo-async": "2.5.0"
+        "chokidar": "^2.0.2",
+        "graceful-fs": "^4.1.2",
+        "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==",
+          "dev": true,
           "requires": {
-            "micromatch": "3.1.9",
-            "normalize-path": "2.1.1"
+            "micromatch": "^3.1.4",
+            "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="
+          "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="
+          "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"
+            "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.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^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=",
+              "dev": true,
               "requires": {
-                "is-descriptor": "1.0.2"
+                "is-descriptor": "^1.0.0"
               }
             },
             "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-extendable": "^0.1.0"
               }
             }
           }
           "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"
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.0",
+            "braces": "^2.3.0",
+            "fsevents": "^1.0.0",
+            "glob-parent": "^3.1.0",
+            "inherits": "^2.0.1",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "normalize-path": "^2.1.1",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.0.0",
+            "upath": "^1.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"
+            "debug": "^2.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
           },
           "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=",
+              "dev": true,
               "requires": {
-                "is-descriptor": "0.1.6"
+                "is-descriptor": "^0.1.0"
               }
             },
             "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-extendable": "^0.1.0"
               }
             },
             "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"
+                "is-accessor-descriptor": "^0.1.6",
+                "is-data-descriptor": "^0.1.4",
+                "kind-of": "^5.0.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=="
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+              "dev": true
             }
           }
         },
           "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"
+            "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^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=",
+              "dev": true,
               "requires": {
-                "is-descriptor": "1.0.2"
+                "is-descriptor": "^1.0.0"
               }
             },
             "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-extendable": "^0.1.0"
               }
             }
           }
           "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"
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.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=",
+              "dev": true,
               "requires": {
-                "is-extendable": "0.1.1"
+                "is-extendable": "^0.1.0"
               }
             }
           }
           "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"
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
           },
           "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"
+                "is-extglob": "^2.1.0"
               }
             }
           }
           "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"
+            "kind-of": "^3.0.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-buffer": "^1.1.5"
               }
             }
           }
           "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"
+            "kind-of": "^3.0.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-buffer": "^1.1.5"
               }
             }
           }
         "is-extglob": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+          "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-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"
+            "kind-of": "^3.0.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-buffer": "^1.1.5"
               }
             }
           }
         "isobject": {
           "version": "3.0.1",
           "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+          "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=="
+          "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"
+            "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
           }
         }
       }
       "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
       "dev": true,
       "requires": {
-        "minimalistic-assert": "1.0.0"
+        "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"
+    "webidl-conversions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+      "dev": true
+    },
+    "webpack": {
+      "version": "4.28.2",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.2.tgz",
+      "integrity": "sha512-PK3uVg3/NuNVOjPfYleFI6JF7khO7c2kIlksH7mivQm+QDcwiqV1x6+q89dDeOioh5FNxJHr3LKbDu3oSAhl9g==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.11",
+        "@webassemblyjs/helper-module-context": "1.7.11",
+        "@webassemblyjs/wasm-edit": "1.7.11",
+        "@webassemblyjs/wasm-parser": "1.7.11",
+        "acorn": "^5.6.2",
+        "acorn-dynamic-import": "^3.0.0",
+        "ajv": "^6.1.0",
+        "ajv-keywords": "^3.1.0",
+        "chrome-trace-event": "^1.0.0",
+        "enhanced-resolve": "^4.1.0",
+        "eslint-scope": "^4.0.0",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^2.3.0",
+        "loader-utils": "^1.1.0",
+        "memory-fs": "~0.4.1",
+        "micromatch": "^3.1.8",
+        "mkdirp": "~0.5.0",
+        "neo-async": "^2.5.0",
+        "node-libs-browser": "^2.0.0",
+        "schema-utils": "^0.4.4",
+        "tapable": "^1.1.0",
+        "terser-webpack-plugin": "^1.1.0",
+        "watchpack": "^1.5.0",
+        "webpack-sources": "^1.3.0"
       },
       "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=",
+        "acorn": {
+          "version": "5.7.3",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
+          "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
           "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=",
+        "acorn-dynamic-import": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
+          "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
           "dev": true,
           "requires": {
-            "adm-zip": "0.4.4",
-            "rimraf": "2.6.2",
-            "tmp": "0.0.24",
-            "ws": "1.1.5",
-            "xml2js": "0.4.4"
+            "acorn": "^5.0.0"
           }
         },
-        "tmp": {
-          "version": "0.0.24",
-          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz",
-          "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=",
+        "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
         },
-        "ultron": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
-          "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=",
+        "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
         },
-        "ws": {
-          "version": "1.1.5",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
-          "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
           "dev": true,
           "requires": {
-            "options": "0.0.6",
-            "ultron": "1.0.2"
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.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.0"
+              }
+            }
           }
         },
-        "xml2js": {
-          "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz",
-          "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=",
+        "enhanced-resolve": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
+          "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
           "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"
+            "graceful-fs": "^4.1.2",
+            "memory-fs": "^0.4.0",
+            "tapable": "^1.0.0"
           }
         },
-        "os-locale": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
-          "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+        "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": {
-            "execa": "0.7.0",
-            "lcid": "1.0.0",
-            "mem": "1.1.0"
+            "debug": "^2.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "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.0"
+              }
+            },
+            "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.0.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
+            }
           }
         },
-        "path-type": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
-          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "dev": true,
           "requires": {
-            "pify": "2.3.0"
+            "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^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=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "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.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=",
+        "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": {
-            "load-json-file": "2.0.0",
-            "normalize-package-data": "2.4.0",
-            "path-type": "2.0.0"
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.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=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.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=",
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
           "requires": {
-            "find-up": "2.1.0",
-            "read-pkg": "2.0.0"
+            "kind-of": "^3.0.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.5"
+              }
+            }
           }
         },
-        "string-width": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
           "requires": {
-            "is-fullwidth-code-point": "2.0.0",
-            "strip-ansi": "4.0.0"
+            "kind-of": "^3.0.2"
           },
           "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=",
+            "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": {
-                "ansi-regex": "3.0.0"
+                "is-buffer": "^1.1.5"
               }
             }
           }
         },
-        "strip-bom": {
+        "is-number": {
           "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=",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
           "requires": {
-            "source-map": "0.5.7",
-            "uglify-to-browserify": "1.0.2",
-            "yargs": "3.10.0"
+            "kind-of": "^3.0.2"
           },
           "dependencies": {
-            "yargs": {
-              "version": "3.10.0",
-              "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
-              "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+            "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": {
-                "camelcase": "1.2.1",
-                "cliui": "2.1.0",
-                "decamelize": "1.2.0",
-                "window-size": "0.1.0"
+                "is-buffer": "^1.1.5"
               }
             }
           }
         },
-        "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"
-          }
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
         },
-        "which-module": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+        "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
         },
-        "y18n": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
-          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
         },
-        "yargs": {
-          "version": "8.0.2",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
-          "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+        "schema-utils": {
+          "version": "0.4.7",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
+          "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
+          "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="
-            },
-            "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"
-                  }
-                }
-              }
-            }
+            "ajv": "^6.1.0",
+            "ajv-keywords": "^3.1.0"
           }
         },
-        "yargs-parser": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
-          "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+        "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
+        },
+        "tapable": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz",
+          "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==",
+          "dev": true
+        },
+        "webpack-sources": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
+          "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
+          "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="
-            }
+            "source-list-map": "^2.0.0",
+            "source-map": "~0.6.1"
           }
         }
       }
       "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=",
       "dev": true,
       "requires": {
-        "source-list-map": "0.1.8",
-        "source-map": "0.4.4"
+        "source-list-map": "~0.1.7",
+        "source-map": "~0.4.1"
       },
       "dependencies": {
         "source-list-map": {
         },
         "source-map": {
           "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
           "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
           "dev": true,
           "requires": {
-            "amdefine": "1.0.1"
+            "amdefine": ">=0.0.4"
           }
         }
       }
     },
     "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==",
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz",
+      "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==",
+      "dev": true,
       "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"
+        "memory-fs": "~0.4.1",
+        "mime": "^2.3.1",
+        "range-parser": "^1.0.3",
+        "webpack-log": "^2.0.0"
+      },
+      "dependencies": {
+        "mime": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
+          "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==",
+          "dev": true
+        }
       }
     },
     "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==",
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz",
+      "integrity": "sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww==",
       "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",
+        "bonjour": "^3.5.0",
+        "chokidar": "^2.0.0",
+        "compression": "^1.5.2",
+        "connect-history-api-fallback": "^1.3.0",
+        "debug": "^3.1.0",
+        "del": "^3.0.0",
+        "express": "^4.16.2",
+        "html-entities": "^1.2.0",
+        "http-proxy-middleware": "~0.18.0",
+        "import-local": "^2.0.0",
+        "internal-ip": "^3.0.1",
+        "ip": "^1.1.5",
+        "killable": "^1.0.0",
+        "loglevel": "^1.4.1",
+        "opn": "^5.1.0",
+        "portfinder": "^1.0.9",
+        "schema-utils": "^1.0.0",
+        "selfsigned": "^1.9.1",
+        "serve-index": "^1.7.2",
         "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"
+        "sockjs-client": "1.3.0",
+        "spdy": "^3.4.1",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^5.1.0",
+        "webpack-dev-middleware": "3.4.0",
+        "webpack-log": "^2.0.0",
+        "yargs": "12.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=",
+          "dev": true
+        },
         "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"
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
           }
         },
         "arr-diff": {
           "dev": true
         },
         "braces": {
-          "version": "2.3.1",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz",
-          "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==",
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.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.0"
+              }
+            }
+          }
+        },
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "chokidar": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+          "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
+          "dev": true,
+          "requires": {
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.0",
+            "braces": "^2.3.0",
+            "fsevents": "^1.2.2",
+            "glob-parent": "^3.1.0",
+            "inherits": "^2.0.1",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "lodash.debounce": "^4.0.8",
+            "normalize-path": "^2.1.1",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.0.0",
+            "upath": "^1.0.5"
+          }
+        },
+        "cliui": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+          "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^2.1.1",
+            "strip-ansi": "^4.0.0",
+            "wrap-ansi": "^2.0.0"
+          },
+          "dependencies": {
+            "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"
+              }
+            }
+          }
+        },
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "dev": true,
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.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==",
+              "dev": true
+            }
+          }
+        },
+        "decamelize": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
+          "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
+          "dev": true,
+          "requires": {
+            "xregexp": "4.0.0"
+          }
+        },
+        "execa": {
+          "version": "0.10.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
+          "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.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.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "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.0"
+              }
+            },
+            "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.0"
+              }
+            },
+            "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.0.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": {
-            "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"
+            "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
           },
           "dependencies": {
             "define-property": {
               "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
               "dev": true,
               "requires": {
-                "is-descriptor": "1.0.2"
+                "is-descriptor": "^1.0.0"
               }
             },
             "extend-shallow": {
               "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
               "dev": true,
               "requires": {
-                "is-extendable": "0.1.1"
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "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.0"
+          },
+          "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.0"
               }
             }
           }
         },
-        "camelcase": {
+        "find-up": {
           "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==",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "locate-path": "^3.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=",
+        "fsevents": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
+          "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
           "dev": true,
+          "optional": 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"
+            "nan": "^2.9.2",
+            "node-pre-gyp": "^0.10.0"
           },
           "dependencies": {
+            "abbrev": {
+              "version": "1.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "ansi-regex": {
+              "version": "2.1.1",
+              "bundled": true,
+              "dev": true
+            },
+            "aproba": {
+              "version": "1.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "are-we-there-yet": {
+              "version": "1.1.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "delegates": "^1.0.0",
+                "readable-stream": "^2.0.6"
+              }
+            },
+            "balanced-match": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true
+            },
+            "brace-expansion": {
+              "version": "1.1.11",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+              }
+            },
+            "chownr": {
+              "version": "1.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "code-point-at": {
+              "version": "1.1.0",
+              "bundled": true,
+              "dev": true
+            },
+            "concat-map": {
+              "version": "0.0.1",
+              "bundled": true,
+              "dev": true
+            },
+            "console-control-strings": {
+              "version": "1.1.0",
+              "bundled": true,
+              "dev": true
+            },
+            "core-util-is": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
             "debug": {
               "version": "2.6.9",
-              "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-              "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "bundled": true,
               "dev": true,
+              "optional": 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=",
+            "deep-extend": {
+              "version": "0.5.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "delegates": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "detect-libc": {
+              "version": "1.0.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "fs-minipass": {
+              "version": "1.2.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minipass": "^2.2.1"
+              }
+            },
+            "fs.realpath": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "gauge": {
+              "version": "2.7.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "aproba": "^1.0.3",
+                "console-control-strings": "^1.0.0",
+                "has-unicode": "^2.0.0",
+                "object-assign": "^4.1.0",
+                "signal-exit": "^3.0.0",
+                "string-width": "^1.0.1",
+                "strip-ansi": "^3.0.1",
+                "wide-align": "^1.1.0"
+              }
+            },
+            "glob": {
+              "version": "7.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.0.4",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+              }
+            },
+            "has-unicode": {
+              "version": "2.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "iconv-lite": {
+              "version": "0.4.21",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "safer-buffer": "^2.1.0"
+              }
+            },
+            "ignore-walk": {
+              "version": "3.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minimatch": "^3.0.4"
+              }
+            },
+            "inflight": {
+              "version": "1.0.6",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "once": "^1.3.0",
+                "wrappy": "1"
+              }
+            },
+            "inherits": {
+              "version": "2.0.3",
+              "bundled": true,
+              "dev": true
+            },
+            "ini": {
+              "version": "1.3.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "is-fullwidth-code-point": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "number-is-nan": "^1.0.0"
+              }
+            },
+            "isarray": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "minimatch": {
+              "version": "3.0.4",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "brace-expansion": "^1.1.7"
+              }
+            },
+            "minimist": {
+              "version": "0.0.8",
+              "bundled": true,
+              "dev": true
+            },
+            "minipass": {
+              "version": "2.2.4",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "safe-buffer": "^5.1.1",
+                "yallist": "^3.0.0"
+              }
+            },
+            "minizlib": {
+              "version": "1.1.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "minipass": "^2.2.1"
+              }
+            },
+            "mkdirp": {
+              "version": "0.5.1",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "minimist": "0.0.8"
+              }
+            },
+            "ms": {
+              "version": "2.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "needle": {
+              "version": "2.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "debug": "^2.1.2",
+                "iconv-lite": "^0.4.4",
+                "sax": "^1.2.4"
+              }
+            },
+            "node-pre-gyp": {
+              "version": "0.10.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "detect-libc": "^1.0.2",
+                "mkdirp": "^0.5.1",
+                "needle": "^2.2.0",
+                "nopt": "^4.0.1",
+                "npm-packlist": "^1.1.6",
+                "npmlog": "^4.0.2",
+                "rc": "^1.1.7",
+                "rimraf": "^2.6.1",
+                "semver": "^5.3.0",
+                "tar": "^4"
+              }
+            },
+            "nopt": {
+              "version": "4.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "abbrev": "1",
+                "osenv": "^0.1.4"
+              }
+            },
+            "npm-bundled": {
+              "version": "1.0.3",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "npm-packlist": {
+              "version": "1.1.10",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ignore-walk": "^3.0.1",
+                "npm-bundled": "^1.0.1"
+              }
+            },
+            "npmlog": {
+              "version": "4.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "are-we-there-yet": "~1.1.2",
+                "console-control-strings": "~1.1.0",
+                "gauge": "~2.7.3",
+                "set-blocking": "~2.0.0"
+              }
+            },
+            "number-is-nan": {
+              "version": "1.0.1",
+              "bundled": true,
+              "dev": true
+            },
+            "object-assign": {
+              "version": "4.1.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "once": {
+              "version": "1.4.0",
+              "bundled": true,
+              "dev": true,
+              "requires": {
+                "wrappy": "1"
+              }
+            },
+            "os-homedir": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "os-tmpdir": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "osenv": {
+              "version": "0.1.5",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "os-homedir": "^1.0.0",
+                "os-tmpdir": "^1.0.0"
+              }
+            },
+            "path-is-absolute": {
+              "version": "1.0.1",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "process-nextick-args": {
+              "version": "2.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "rc": {
+              "version": "1.2.7",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "deep-extend": "^0.5.1",
+                "ini": "~1.3.0",
+                "minimist": "^1.2.0",
+                "strip-json-comments": "~2.0.1"
+              },
+              "dependencies": {
+                "minimist": {
+                  "version": "1.2.0",
+                  "bundled": true,
+                  "dev": true,
+                  "optional": true
+                }
+              }
+            },
+            "readable-stream": {
+              "version": "2.3.6",
+              "bundled": true,
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+              }
+            },
+            "rimraf": {
+              "version": "2.6.2",
+              "bundled": true,
               "dev": true,
+              "optional": true,
               "requires": {
-                "is-descriptor": "0.1.6"
+                "glob": "^7.0.5"
               }
             },
-            "extend-shallow": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+            "safe-buffer": {
+              "version": "5.1.1",
+              "bundled": true,
+              "dev": true
+            },
+            "safer-buffer": {
+              "version": "2.1.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "sax": {
+              "version": "1.2.4",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "semver": {
+              "version": "5.5.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "set-blocking": {
+              "version": "2.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "signal-exit": {
+              "version": "3.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "string-width": {
+              "version": "1.0.2",
+              "bundled": true,
               "dev": true,
               "requires": {
-                "is-extendable": "0.1.1"
+                "code-point-at": "^1.0.0",
+                "is-fullwidth-code-point": "^1.0.0",
+                "strip-ansi": "^3.0.0"
               }
             },
-            "is-descriptor": {
-              "version": "0.1.6",
-              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+            "string_decoder": {
+              "version": "1.1.1",
+              "bundled": true,
               "dev": true,
+              "optional": true,
               "requires": {
-                "is-accessor-descriptor": "0.1.6",
-                "is-data-descriptor": "0.1.4",
-                "kind-of": "5.1.0"
+                "safe-buffer": "~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=",
+            "strip-ansi": {
+              "version": "3.0.1",
+              "bundled": true,
               "dev": true,
               "requires": {
-                "is-descriptor": "1.0.2"
+                "ansi-regex": "^2.0.0"
               }
             },
-            "extend-shallow": {
+            "strip-json-comments": {
               "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "tar": {
+              "version": "4.4.1",
+              "bundled": true,
               "dev": true,
+              "optional": true,
               "requires": {
-                "is-extendable": "0.1.1"
+                "chownr": "^1.0.1",
+                "fs-minipass": "^1.2.5",
+                "minipass": "^2.2.4",
+                "minizlib": "^1.1.0",
+                "mkdirp": "^0.5.0",
+                "safe-buffer": "^5.1.1",
+                "yallist": "^3.0.2"
               }
-            }
-          }
-        },
-        "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=",
+            },
+            "util-deprecate": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            },
+            "wide-align": {
+              "version": "1.1.2",
+              "bundled": true,
               "dev": true,
+              "optional": true,
               "requires": {
-                "is-extendable": "0.1.1"
+                "string-width": "^1.0.2"
               }
+            },
+            "wrappy": {
+              "version": "1.0.2",
+              "bundled": true,
+              "dev": true
+            },
+            "yallist": {
+              "version": "3.0.2",
+              "bundled": true,
+              "dev": true
             }
           }
         },
           "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
           "dev": true,
           "requires": {
-            "is-glob": "3.1.0",
-            "path-dirname": "1.0.2"
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
           },
           "dependencies": {
             "is-glob": {
               "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
               "dev": true,
               "requires": {
-                "is-extglob": "2.1.1"
+                "is-extglob": "^2.1.0"
               }
             }
           }
           "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
           "dev": true
         },
+        "invert-kv": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
+          "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
+          "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"
+            "kind-of": "^3.0.2"
           },
           "dependencies": {
             "kind-of": {
               "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
               "dev": true,
               "requires": {
-                "is-buffer": "1.1.6"
+                "is-buffer": "^1.1.5"
               }
             }
           }
           "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
           "dev": true,
           "requires": {
-            "kind-of": "3.2.2"
+            "kind-of": "^3.0.2"
           },
           "dependencies": {
             "kind-of": {
               "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
               "dev": true,
               "requires": {
-                "is-buffer": "1.1.6"
+                "is-buffer": "^1.1.5"
               }
             }
           }
           "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
           "dev": true
         },
+        "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
+        },
         "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-extglob": "^2.1.1"
           }
         },
         "is-number": {
           "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
           "dev": true,
           "requires": {
-            "kind-of": "3.2.2"
+            "kind-of": "^3.0.2"
           },
           "dependencies": {
             "kind-of": {
               "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
               "dev": true,
               "requires": {
-                "is-buffer": "1.1.6"
+                "is-buffer": "^1.1.5"
               }
             }
           }
           "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
           "dev": true
         },
+        "lcid": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+          "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
+          "dev": true,
+          "requires": {
+            "invert-kv": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "mem": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz",
+          "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==",
+          "dev": true,
+          "requires": {
+            "map-age-cleaner": "^0.1.1",
+            "mimic-fn": "^1.0.0",
+            "p-is-promise": "^1.1.0"
+          }
+        },
         "micromatch": {
-          "version": "3.1.9",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz",
-          "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==",
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "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.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "os-locale": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz",
+          "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==",
+          "dev": true,
+          "requires": {
+            "execa": "^0.10.0",
+            "lcid": "^2.0.0",
+            "mem": "^4.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
+          "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "p-try": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+          "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
+          "dev": true
+        },
+        "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": {
-            "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"
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          },
+          "dependencies": {
+            "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"
+              }
+            }
           }
         },
         "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==",
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
           "dev": true,
           "requires": {
-            "has-flag": "3.0.0"
+            "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=",
+        "upath": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
+          "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
+          "dev": true
+        },
+        "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
         },
         "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"
+          "version": "12.0.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz",
+          "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==",
+          "dev": true,
+          "requires": {
+            "cliui": "^4.0.0",
+            "decamelize": "^2.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^1.0.1",
+            "os-locale": "^3.0.0",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^1.0.1",
+            "set-blocking": "^2.0.0",
+            "string-width": "^2.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^3.2.1 || ^4.0.0",
+            "yargs-parser": "^10.1.0"
           }
         },
         "yargs-parser": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
-          "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
+          "version": "10.1.0",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
+          "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
           "dev": true,
           "requires": {
-            "camelcase": "3.0.0"
+            "camelcase": "^4.1.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==",
+    "webpack-log": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
+      "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
+      "dev": true,
       "requires": {
-        "ansi-html": "0.0.7",
-        "html-entities": "1.2.1",
-        "querystring": "0.2.0",
-        "strip-ansi": "3.0.1"
+        "ansi-colors": "^3.0.0",
+        "uuid": "^3.3.2"
+      },
+      "dependencies": {
+        "uuid": {
+          "version": "3.3.2",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+          "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+          "dev": true
+        }
       }
     },
     "webpack-merge": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz",
-      "integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==",
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz",
+      "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==",
       "dev": true,
       "requires": {
-        "lodash": "4.17.5"
+        "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==",
+      "dev": true,
       "requires": {
-        "source-list-map": "2.0.0",
-        "source-map": "0.6.1"
+        "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=="
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
         }
       }
     },
     "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=",
+      "version": "1.1.0-rc.6",
+      "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz",
+      "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==",
       "dev": true,
       "requires": {
-        "webpack-core": "0.6.9"
+        "webpack-core": "^0.6.8"
       }
     },
     "websocket-driver": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
       "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+      "dev": true,
       "requires": {
-        "http-parser-js": "0.4.11",
-        "websocket-extensions": "0.1.3"
+        "http-parser-js": ">=0.4.0",
+        "websocket-extensions": ">=0.1.1"
       }
     },
     "websocket-extensions": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
-      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg=="
+      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+      "dev": true
     },
-    "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=="
+    "whatwg-encoding": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "0.4.24"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        }
+      }
+    },
+    "whatwg-mimetype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+      "dev": true
+    },
+    "whatwg-url": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
+      "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
+      "dev": true,
+      "requires": {
+        "lodash.sortby": "^4.7.0",
+        "tr46": "^1.0.1",
+        "webidl-conversions": "^4.0.2"
+      }
     },
     "when": {
       "version": "3.6.4",
       "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==",
+      "dev": true,
       "requires": {
-        "isexe": "2.0.0"
+        "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
+      "dev": true,
+      "optional": 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==",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+      "dev": true,
       "requires": {
-        "string-width": "1.0.2"
+        "string-width": "^1.0.2 || 2"
       }
     },
     "window-size": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
-      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
+      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+      "dev": true
     },
     "wordwrap": {
       "version": "0.0.2",
       "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
-      "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
+      "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+      "dev": true
     },
     "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==",
+      "dev": true,
       "requires": {
-        "errno": "0.1.7"
+        "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=",
+      "dev": true,
       "requires": {
-        "string-width": "1.0.2",
-        "strip-ansi": "3.0.1"
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1"
       }
     },
     "wrappy": {
       "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==",
+    "write-file-atomic": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz",
+      "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==",
       "dev": true,
       "requires": {
-        "async-limiter": "1.0.0",
-        "safe-buffer": "5.1.1",
-        "ultron": "1.1.1"
+        "graceful-fs": "^4.1.11",
+        "imurmurhash": "^0.1.4",
+        "signal-exit": "^3.0.2"
       }
     },
-    "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==",
+    "ws": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
+      "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
       "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
-        }
+        "async-limiter": "~1.0.0"
       }
     },
-    "xmlbuilder": {
-      "version": "9.0.7",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
-      "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
+    "xhr2": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz",
+      "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8="
+    },
+    "xml": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
+      "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=",
       "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=",
+    "xml-name-validator": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
       "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
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
+      "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
+      "dev": 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"
-      }
+      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+      "dev": true
     },
     "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=="
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+      "dev": true
     },
     "yallist": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "dev": true
     },
     "yargs": {
       "version": "7.1.0",
       "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"
+        "camelcase": "^3.0.0",
+        "cliui": "^3.2.0",
+        "decamelize": "^1.1.1",
+        "get-caller-file": "^1.0.1",
+        "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": {
       "dev": true,
       "optional": true,
       "requires": {
-        "camelcase": "3.0.0"
+        "camelcase": "^3.0.0"
       },
       "dependencies": {
         "camelcase": {
       }
     },
     "yauzl": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
-      "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.8.0.tgz",
+      "integrity": "sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI=",
       "dev": true,
       "requires": {
-        "fd-slicer": "1.0.1"
+        "buffer-crc32": "~0.2.3",
+        "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",
       "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=="
+      "version": "0.8.26",
+      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz",
+      "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA=="
     }
   }
 }
diff --git a/vid-webpack-master/package.cypress.json b/vid-webpack-master/package.cypress.json
new file mode 100644 (file)
index 0000000..39a4008
--- /dev/null
@@ -0,0 +1,20 @@
+{
+  "name": "vid-cli",
+  "version": "0.0.0",
+  "license": "MIT",
+  "scripts": {
+    "cypress:open": "cypress open",
+    "cypress": "cypress open --config baseUrl=http://localhost:8080/vid ",
+    "cypress:run": "cypress run",
+    "cypress:headless": "cypress run --config baseUrl=http://localhost:8080/vid "
+  },
+  "private": true,
+  "dependencies": {},
+  "devDependencies": {
+    "@bahmutov/add-typescript-to-cypress": "2.0.0",
+    "cypress": "^3.1.0",
+    "typescript": "2.9.2",
+    "rxjs": "^6.3.3",
+    "rxjs-compat": "^6.3.3"
+  }
+}
index cf28350..ff2682b 100644 (file)
   "scripts": {
     "ng": "ng",
     "start": "ng serve --port 4201",
-    "build": "ng build --no-progress --no-aot",
+    "build": "ng build --no-progress --no-aot --output-hashing all",
     "build.prod": "ng build",
-    "test": "ng test --c --single-run",
-    "lint": "ng lint --type-check --fix",
+    "test": "jest",
+    "test:jest": "jest",
+    "test:jest:pipeline": "jest --silent --ci --reporters=default --reporters=jest-junit",
+    "test:jest:watch": "jest --watch",
+    "test:jest:coverage": "jest --ci --reporters=default --reporters=jest-junit --coverage --silent",
+    "test:jest:snapshot": "jest --ci --reporters=default --reporters=jest-junit --coverage -u",
+    "test:watch": "jest --clearCache && jest --watch",
     "coverage": "ng test --code-coverage",
-    "coverage-console": "ng test --c --single-run",
+    "verify": "cypress verify",
     "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"
+    "cypress": "cypress open --config baseUrl=http://localhost:8080/vid ",
+    "cypress:run": "cypress run",
+    "cypress:headless": "cypress run --config baseUrl=http://localhost:8080/vid",
+    "format": "prettier",
+    "format:fix": "pretty-quick --staged",
+    "lint": "ng lint"
   },
   "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",
+    "@angular-redux/store": "^9.0.0",
+    "@angular/animations": "^7.1.4",
+    "@angular/cdk": "^7.2.2",
+    "@angular/common": "^7.1.4",
+    "@angular/compiler": "^7.1.4",
+    "@angular/core": "^7.1.4",
+    "@angular/forms": "^7.1.4",
+    "@angular/http": "^7.1.4",
+    "@angular/material": "7.2.2",
+    "@angular/platform-browser": "^7.1.4",
+    "@angular/platform-browser-dynamic": "^7.1.4",
+    "@angular/platform-server": "^7.1.4",
+    "@angular/router": "^7.1.4",
     "@harmowatch/ngx-redux-core": "0.2.2",
     "@nicky-lenaers/ngx-scroll-to": "^0.6.1",
+    "@turf/turf": "^5.1.6",
     "@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",
+    "angular5-csv": "^0.2.10",
     "bootstrap": "^4.1.2",
-    "core-js": "2.4.1",
+    "core-js": "^2.6.1",
     "font-awesome": "^4.7.0",
+    "install": "^0.12.2",
+    "jest-image-snapshot": "2.8.1",
+    "jest-preset-angular": "6.0.2",
     "ng-multiselect-dropdown": "0.1.3",
     "ng2-bootstrap-modal": "1.0.1",
     "ngx-bootstrap": "^2.0.2",
-    "ngx-contextmenu": "4.1.2",
+    "ngx-contextmenu": "^5.1.1",
     "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",
+    "npm": "^6.4.1",
+    "redux": "^4.0.1",
+    "redux-observable": "^1.0.0",
+    "rxjs": "^6.3.3",
+    "rxjs-compat": "^6.3.3",
+    "slnodejs": "^2.1.124",
     "tslib": "1.9.x",
-    "zone.js": "0.8.19"
+    "zone.js": "^0.8.26"
   },
   "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",
+    "@angular-builders/jest": "^7.1.2",
+    "@angular-devkit/build-angular": "^0.11.4",
+    "@angular/cli": "^7.1.4",
+    "@angular/compiler-cli": "^7.1.4",
+    "@angular/language-service": "^7.1.4",
+    "@babel/preset-env": "^7.2.3",
+    "@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"
+    "@types/cypress": "1.1.3",
+    "@types/jest": "24.0.6",
+    "@types/jest-each": "0.3.4",
+    "@types/node": "^10.12.18",
+    "angular2-template-loader": "^0.6.2",
+    "babel-jest": "24.1.0",
+    "codelyzer": "^4.5.0",
+    "cypress": "^3.1.0",
+    "hammerjs": "2.0.8",
+    "husky": "^1.3.1",
+    "istanbul-reports": "^2.0.1",
+    "jest": "24.1.0",
+    "jest-each": "24.0.0",
+    "jest-junit": "6.3.0",
+    "jest-sonar-reporter": "2.0.0",
+    "ngx-wallaby-jest": "0.0.1",
+    "npm-run-all": "^4.1.5",
+    "onap-ui-angular": "5.1.71",
+    "onap-ui-common": "1.0.86",
+    "prettier": "1.16.4",
+    "pretty-quick": "^1.10.0",
+    "ts-mockito": "2.3.1",
+    "ts-node": "~5.0.1",
+    "tslint": "^5.12.0",
+    "typescript": "^3.1.6",
+    "wallaby-webpack": "^3.9.11",
+    "webpack": "^4.28.2"
+  },
+  "jest-junit": {
+    "outputDirectory": "./coverage",
+    "outputName": "./test-results-jest.xml"
+  },
+  "jest": {
+    "preset": "jest-preset-angular",
+    "setupFilesAfterEnv": ["<rootDir>/src/setupJest.ts"],
+    "transform": {
+      "^.+\\.(ts|html)$": "<rootDir>/node_modules/jest-preset-angular/preprocessor.js",
+      "^.+\\.js$": "babel-jest"
+    }
   }
 }
index 6fb2c40..a9aee06 100644 (file)
@@ -37,7 +37,7 @@ import 'core-js/es6/set';
 // import 'classlist.js';
 
 /** IE10 and IE11 requires the following to support `@angular/animation`. */
-//import 'web-animations-js';  // Run `npm install --save web-animations-js`.
+/** import 'web-animations-js';  // Run `npm install --save web-animations-js`*/
 
 
 /** Evergreen browsers require these. **/
@@ -46,7 +46,7 @@ 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`.
+/** import 'web-animations-js';  // Run `npm install --save web-animations-js`.*/
 
 
 
@@ -63,4 +63,4 @@ import 'zone.js/dist/zone';  // Included with Angular CLI.
  * Date, currency, decimal and percent pipes.
  * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
  */
-//import 'intl';  // Run `npm install --save intl`.
+/** import 'intl';  // Run `npm install --save intl`.*/
index b4445dd..3fa600f 100644 (file)
@@ -9,13 +9,16 @@
       inherit from a parent maven module. -->
   <groupId>org.onap.vid</groupId>
   <artifactId>vid-webpack-master</artifactId>
-  <version>1.3.0-SNAPSHOT</version>
+  <version>1.3.0</version>
   <packaging>war</packaging>
   <name>VID UI</name>
   <description>VID UI</description>
 
   <properties>
     <encoding>UTF-8</encoding>
+    <!--<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. -->
       </build>
     </profile>
     <profile>
-      <id>webpack</id>
+      <id>webpack-npm</id>
       <build>
         <plugins>
           <plugin>
               </execution>
 
               <execution>
-                <id>npm run test</id>
+                <id>npm run</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>
+                  <arguments>run ${NPM_CMD}</arguments>
                 </configuration>
               </execution>
 
diff --git a/vid-webpack-master/processCss.js b/vid-webpack-master/processCss.js
new file mode 100644 (file)
index 0000000..81953b9
--- /dev/null
@@ -0,0 +1,20 @@
+const next = require('postcss-cssnext');
+const modules = require('postcss-modules');
+const postcss = require('postcss');
+
+const processCss = function(file, done) {
+  postcss([
+    next,
+    modules({
+      getJSON: function(filename, json) {
+        file.rename(file.path + '.json')
+        done(JSON.stringify(json))
+      }
+    })
+  ]).process(file.content, {
+    from: file.path,
+    to: file.path
+  }).catch(function(err) {
+    throw err
+  })
+}
diff --git a/vid-webpack-master/src/app/angular-tree-component.scss b/vid-webpack-master/src/app/angular-tree-component.scss
new file mode 100644 (file)
index 0000000..40333b9
--- /dev/null
@@ -0,0 +1,83 @@
+.tree-children.tree-children-no-padding { padding-left: 0 }
+.tree-children { padding-left: 20px; overflow: hidden }
+.node-drop-slot { display: block; height: 2px }
+.node-drop-slot.is-dragging-over { background: #ddffee; height: 20px; border: 2px dotted #888; }
+.toggle-children-wrapper-expanded .toggle-children { transform: rotate(90deg) }
+.toggle-children-wrapper-collapsed .toggle-children { transform: rotate(0); }
+.toggle-children-wrapper {
+  padding: 2px 3px 5px 1px;
+}
+/* tslint:disable */
+.toggle-children {
+  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABAhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjY1RTYzOTA2ODZDRjExREJBNkUyRDg4N0NFQUNCNDA3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYzRkRFQjcxODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYzRkRFQjcwODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTk5NzA1OGEtZDI3OC00NDZkLWE4ODgtNGM4MGQ4YWI1NzNmIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRkZmQxMGMtY2NlNS0xMTc4LWE5OGQtY2NkZmM5ODk5YWYwIi8+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+Z2x5cGhpY29uczwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+5iogFwAAAGhJREFUeNpiYGBgKABigf///zOQg0EARH4A4gZyDIIZ8B/JoAJKDIDhB0CcQIkBRBtEyABkgxwoMQCGD6AbRKoBGAYxQgXIBRuZGKgAKPIC3QLxArnRSHZCIjspk52ZKMrOFBUoAAEGAKnq593MQAZtAAAAAElFTkSuQmCC');
+  height: 8px;
+  width: 9px;
+  background-size: contain;
+  display: inline-block;
+  position: relative;
+  top: 1px;
+  background-repeat: no-repeat;
+  background-position: center;
+}
+.toggle-children-placeholder {
+  display: inline-block;
+  height: 10px;
+  width: 10px;
+  position: relative;
+  top: 1px;
+  padding-right: 3px;
+}
+.node-content-wrapper {
+  display: inline-block;
+  padding: 2px 5px;
+  border-radius: 2px;
+  transition: background-color .15s,box-shadow .15s;
+}
+.node-wrapper {display: flex; align-items: flex-start;}
+.node-content-wrapper-active,
+.node-content-wrapper.node-content-wrapper-active:hover,
+.node-content-wrapper-active.node-content-wrapper-focused {
+  background: #beebff;
+}
+.node-content-wrapper-focused { background: #e7f4f9 }
+.node-content-wrapper:hover { background: #f7fbff }
+.node-content-wrapper-active, .node-content-wrapper-focused, .node-content-wrapper:hover {
+  box-shadow: inset 0 0 1px #999;
+}
+.node-content-wrapper.is-dragging-over { background: #ddffee; box-shadow: inset 0 0 1px #999; }
+.node-content-wrapper.is-dragging-over-disabled { opacity: 0.5 }
+
+tree-viewport {
+  height: 100%;
+  overflow: auto;
+  display: block;
+}
+.tree-children { padding-left: 20px }
+.empty-tree-drop-slot .node-drop-slot { height: 20px; min-width: 100px }
+.angular-tree-component {
+  width: 100%;
+  position:relative;
+  display: inline-block;
+  cursor: pointer;
+  -webkit-touch-callout: none; /* iOS Safari */
+  -webkit-user-select: none;   /* Chrome/Safari/Opera */
+  -khtml-user-select: none;    /* Konqueror */
+  -moz-user-select: none;      /* Firefox */
+  -ms-user-select: none;       /* IE/Edge */
+  user-select: none;           /* non-prefixed version, currently not supported by any browser */
+}
+
+tree-root .angular-tree-component-rtl {
+  direction: rtl;
+}
+tree-root .angular-tree-component-rtl .toggle-children-wrapper-collapsed .toggle-children {
+  transform: rotate(180deg) !important;
+}
+tree-root .angular-tree-component-rtl .tree-children {
+  padding-right: 20px;
+  padding-left: 0;
+}
+
+tree-node-checkbox {
+  padding: 1px;
+}
index 3768d0c..a247e2f 100644 (file)
@@ -1,6 +1,7 @@
 <main>
   <router-outlet>
     <message-box></message-box>
+    <audit-info-modal></audit-info-modal>
     <spinner-component></spinner-component>
   </router-outlet>
 </main>
index 528c7d7..dc4bc88 100644 (file)
@@ -1,28 +1,17 @@
-import {Component, Inject} from '@angular/core';
-
-import { ApiService } from './shared';
-
-import '../style/app.scss';
+import {Component} from '@angular/core';
 import {NgRedux} from "@angular-redux/store";
-import {AppState} from "./store/reducers";
-import { LogService } from './shared/utils/log/log.service';
+import {AppState} from "./shared/store/reducers";
+import '../style/app.scss';
 
 @Component({
-  selector: 'vid-app', // <vid-app></vid-app>
+  selector: '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;
+  constructor(private store: NgRedux<AppState>) {
     store.subscribe(()=>{
       sessionStorage.setItem('reduxState', JSON.stringify(store.getState()));
     });
-
-    this._logService.info("testing new log service");
   }
 }
index a87ffb5..ce9b7da 100644 (file)
@@ -1,26 +1,26 @@
-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';
+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 {routing} from './app.routing';
+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 "./shared/store/module";
+import {HttpInterceptorService} from './shared/utils/httpInterceptor/httpInterceptor.service';
+import {DrawingBoardModule} from './drawingBoard/drawingBoard.module';
+import {ScrollToModule} from '@nicky-lenaers/ngx-scroll-to';
+import {LogService} from './shared/utils/log/log.service';
+import {FeatureFlagsService} from "./shared/services/featureFlag/feature-flags.service";
+import {SupportComponent} from "./support/support.component";
+import {DrawingBoardGuard} from "./drawingBoard/guards/servicePlanningGuard/drawingBoardGuard";
+import {MsoService} from "./shared/services/msoService/mso.service";
+import {HealthStatusModule} from "./healthStatus/health-status.module";
 
 @NgModule({
   imports: [
@@ -31,11 +31,10 @@ import { LogService } from './shared/utils/log/log.service';
     SharedModule.forRoot(),
     ScrollToModule.forRoot(),
     DrawingBoardModule,
+    HealthStatusModule,
     VlanTaggingModule,
     InstantiationStatusModule,
-    BrowseSdcModule,
     BootstrapModalModule,
-    BrowseSdcModule,
     AngularSvgIconModule,
     ReactiveFormsModule,
     NgReduxModule,
@@ -43,37 +42,22 @@ import { LogService } from './shared/utils/log/log.service';
   ],
   declarations: [
     AppComponent,
-    HomeComponent,
-    HealthStatusComponent
+    SupportComponent,
   ],
   providers: [
-    ApiService,
     LogService,
+    FeatureFlagsService,
+    DrawingBoardGuard,
+    MsoService,
     { 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;
-  }
 }
index e6f42f9..779d17e 100644 (file)
@@ -1,40 +1,23 @@
 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";
-
+import {FlagsResolve} from "./shared/resolvers/flag/flag.resolver";
+import {DrawingBoardRoutes} from "./drawingBoard/drawingBoard.routing";
+import {GenericFormPopupComponent} from "./shared/components/genericFormPopup/generic-form-popup.component";
+import {SupportComponent} from "./support/support.component";
+import {HealthStatusRoutes} from "./healthStatus/health-status.routing";
+import {VlanTaggingRoutes} from "./vlanTagging/vlan-tagging.routing";
+import {InstantiationStatusRoutes} from "./instantiationStatus/InstantiationStatus.routing";
 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,
-  }}
-
+  ...DrawingBoardRoutes,
+  ...HealthStatusRoutes,
+  ...VlanTaggingRoutes,
+  ...InstantiationStatusRoutes,
+  {
+    path: 'servicePopup',
+    component: GenericFormPopupComponent,
+    resolve: {
+      flags: FlagsResolve
+    }
+  },
+  {path: 'support', component: SupportComponent},
 ];
-
 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
deleted file mode 100644 (file)
index 7ffd793..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<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
deleted file mode 100644 (file)
index 0d1678a..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-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
deleted file mode 100644 (file)
index 46f37dc..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-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
deleted file mode 100644 (file)
index b7dd78e..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-
-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
deleted file mode 100644 (file)
index 8faf04d..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-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
deleted file mode 100644 (file)
index 92bcbd1..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-.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
deleted file mode 100644 (file)
index 68209b8..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<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
deleted file mode 100644 (file)
index 5650e5d..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<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
deleted file mode 100644 (file)
index f348879..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-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
deleted file mode 100644 (file)
index aa20309..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * 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/instance-popup/instance-popup.components.ts b/vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts
deleted file mode 100644 (file)
index b8ce613..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-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
deleted file mode 100644 (file)
index b6a2e39..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-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
deleted file mode 100644 (file)
index 3d632bd..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-
-<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
deleted file mode 100644 (file)
index 928343d..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#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
deleted file mode 100644 (file)
index 605653b..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-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
deleted file mode 100644 (file)
index 99b390d..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-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
deleted file mode 100644 (file)
index c7894e2..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-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
deleted file mode 100644 (file)
index 908ae4a..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-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
deleted file mode 100644 (file)
index e967daa..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<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
deleted file mode 100644 (file)
index aa4552d..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-$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
deleted file mode 100644 (file)
index cddc640..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-
-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
deleted file mode 100644 (file)
index f6efd35..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-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
deleted file mode 100644 (file)
index 725e442..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-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
deleted file mode 100644 (file)
index ccdaac5..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-
-<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.service.spec.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts
deleted file mode 100644 (file)
index 41ddb43..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-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
deleted file mode 100644 (file)
index 677895e..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-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
deleted file mode 100644 (file)
index 9a2694c..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-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
deleted file mode 100644 (file)
index 7dbe9b1..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-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
deleted file mode 100644 (file)
index 26e667d..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-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
deleted file mode 100644 (file)
index d2e043b..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<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/configuration/vid.configuration.ts b/vid-webpack-master/src/app/configuration/vid.configuration.ts
deleted file mode 100644 (file)
index 2430d3b..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-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
deleted file mode 100644 (file)
index 5eb9773..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<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
deleted file mode 100644 (file)
index 44f9410..0000000
+++ /dev/null
@@ -1,398 +0,0 @@
-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
deleted file mode 100644 (file)
index 4e5819e..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-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.ts b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts
deleted file mode 100644 (file)
index 57dc4b4..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-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
deleted file mode 100644 (file)
index 7d0f7f4..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<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
deleted file mode 100644 (file)
index 29b7711..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-.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
deleted file mode 100644 (file)
index 38284e2..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-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-tree/drawing-board-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts
deleted file mode 100644 (file)
index 6b717a9..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-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
deleted file mode 100644 (file)
index c4061db..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<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>
-
-
index 41efbe0..6a3574f 100644 (file)
@@ -1,41 +1,86 @@
-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';
+import {AvailableModelsTreeService} from './service-planning/available-models-tree/available-models-tree.service';
+import {HighlightPipe} from '../shared/pipes/highlight/highlight-filter.pipe';
+import {TreeModule} from 'angular-tree-component';
+import {BrowserModule} from '@angular/platform-browser';
+import {TooltipModule} from 'ngx-tooltip';
+import {AvailableModelsTreeComponent} from './service-planning/available-models-tree/available-models-tree.component';
+import {AaiService} from '../shared/services/aaiService/aai.service';
+import {DrawingBoardTreeComponent} from './service-planning/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 './service-planning/drawing-board-header/drawing-board-header.component';
+import {ServicePlanningComponent, ServicePlanningEmptyComponent} from './service-planning/service-planning.component';
+import {DuplicateVnfComponent} from './service-planning/duplicate/duplicate-vnf.component';
+import {DuplicateService} from './service-planning/duplicate/duplicate.service';
+import {FormsModule} from '@angular/forms';
+import {DrawingBoardTreeService} from "./service-planning/drawing-board-tree/drawing-board-tree.service";
+import {DrawingBoardHeaderService} from "./service-planning/drawing-board-header/drawing-board-header.service";
+import {TreeNodeHeaderPropertiesComponent} from "./service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component";
+import {SafePipe} from "../shared/pipes/safe/safe.pipe";
+import {FeatureFlagModule} from "../featureFlag/featureFlag.module";
+import {DynamicInputsService} from "./service-planning/objectsToTree/dynamicInputs.service";
+import {InstanceTreeGenerator} from "./service-planning/drawing-board-tree/instance.tree.generator";
+import {SharedTreeService} from "./service-planning/objectsToTree/shared.tree.service";
+import {ObjectToModelTreeService} from "./service-planning/objectsToTree/objectToModelTree/objectToModelTree.service";
+import {ObjectToInstanceTreeService} from "./service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service";
+import {ObjectToTreeService} from "./service-planning/objectsToTree/objectToTree.service";
+import {SearchComponent} from "./service-planning/search/search.component";
+import {SdcUiComponentsModule} from "onap-ui-angular";
+import {DrawingBoardPermissions} from "./guards/servicePlanningGuard/drawingBoardGuard";
+import {NgModule} from '@angular/core';
+import {DragAndDropService} from "./service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service";
+import {SdcUiServices} from "onap-ui-angular/dist";
+import {CreateDynamicComponentService} from "onap-ui-angular/dist/utils/create-dynamic-component.service";
+import {ComponentInfoComponent} from './service-planning/component-info/component-info.component';
+import {ComponentInfoService} from "./service-planning/component-info/component-info.service";
+
 
 @NgModule({
   imports: [
     TreeModule,
     BrowserModule,
     ContextMenuModule,
+    FormsModule,
     TooltipModule,
     CommonModule,
-    SharedModule.forRoot()],
+    SdcUiComponentsModule,
+    SharedModule.forRoot(),
+    FeatureFlagModule.forRoot()],
   providers: [
-    ServicePlanningService,
     AaiService,
-    AvailableModelsTreeService ,
+    ObjectToTreeService,
+    AvailableModelsTreeService,
     ContextMenuService,
-    ServicePlanningService],
+    DuplicateService,
+    DrawingBoardTreeService,
+    DrawingBoardHeaderService,
+    DrawingBoardPermissions,
+    SafePipe,
+    ObjectToInstanceTreeService,
+    ObjectToModelTreeService,
+    DynamicInputsService,
+    InstanceTreeGenerator,
+    SharedTreeService,
+    SdcUiServices.ModalService,
+    SdcUiServices.LoaderService,
+    CreateDynamicComponentService,
+    ComponentInfoService,
+    DragAndDropService],
   declarations: [
     AvailableModelsTreeComponent,
     HighlightPipe,
     DrawingBoardTreeComponent,
     DrawingBoardHeader,
     ServicePlanningComponent,
-    ServicePlanningEmptyComponent],
-  exports: [ AvailableModelsTreeComponent, DrawingBoardTreeComponent, DrawingBoardHeader]
+    ServicePlanningEmptyComponent,
+    DuplicateVnfComponent,
+    TreeNodeHeaderPropertiesComponent,
+    SearchComponent,
+    ComponentInfoComponent],
+  entryComponents: [DuplicateVnfComponent],
+  exports: [AvailableModelsTreeComponent, DrawingBoardTreeComponent, DrawingBoardHeader, TreeNodeHeaderPropertiesComponent, SearchComponent]
 })
 
-export class DrawingBoardModule { }
+export class DrawingBoardModule {
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/drawingBoard.routing.ts b/vid-webpack-master/src/app/drawingBoard/drawingBoard.routing.ts
new file mode 100644 (file)
index 0000000..0c1fa70
--- /dev/null
@@ -0,0 +1,63 @@
+import {Route} from '@angular/router';
+import {ServicePlanningComponent, ServicePlanningEmptyComponent} from "./service-planning/service-planning.component";
+import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver";
+import {ViewEditResolver} from "../shared/resolvers/viewEdit/viewEdit.resolver";
+import {DrawingBoardGuard} from "./guards/servicePlanningGuard/drawingBoardGuard";
+import {RetryResolver} from "../shared/resolvers/retry/retry.resolver";
+
+export const DrawingBoardRoutes: Route[] = [
+  {
+    path: 'servicePlanning',
+    children: [
+      {
+        path: 'EDIT',
+        component: ServicePlanningComponent,
+        resolve: {
+          flags: FlagsResolve,
+          viewEditResolver: ViewEditResolver
+        },
+        canActivate: [DrawingBoardGuard]
+      },
+      {
+        path: 'VIEW',
+        component: ServicePlanningComponent,
+        resolve: {
+          flags: FlagsResolve,
+          viewEditResolver: ViewEditResolver
+        }
+      },
+      {
+        path: 'RETRY_EDIT',
+        component: ServicePlanningComponent,
+        resolve: {
+          flags: FlagsResolve,
+          viewEditResolver: RetryResolver
+        },
+        canActivate: [DrawingBoardGuard]
+      },
+      {
+        path: 'RETRY',
+        component: ServicePlanningComponent,
+        resolve: {
+          flags: FlagsResolve,
+          viewEditResolver: RetryResolver
+        }
+      },
+      {
+        path: '',
+        component: ServicePlanningComponent,
+        resolve: {
+          flags: FlagsResolve
+        },
+      }
+    ]
+  },
+  {
+    path: 'servicePlanningEmpty',
+    component: ServicePlanningEmptyComponent,
+    resolve: {
+      flags: FlagsResolve,
+    }
+  },
+];
+
diff --git a/vid-webpack-master/src/app/drawingBoard/guards/servicePlanningGuard/drawingBoardGuard.ts b/vid-webpack-master/src/app/drawingBoard/guards/servicePlanningGuard/drawingBoardGuard.ts
new file mode 100644 (file)
index 0000000..4a305b1
--- /dev/null
@@ -0,0 +1,56 @@
+import {Injectable} from "@angular/core";
+import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router} from "@angular/router";
+import {NgRedux} from "@angular-redux/store";
+import {Observable} from "rxjs";
+import {HttpClient} from "@angular/common/http";
+import {AppState} from "../../../shared/store/reducers";
+import {updateDrawingBoardStatus} from "../../../shared/storeUtil/utils/global/global.actions";
+import {DrawingBoardModes} from "../../service-planning/drawing-board.modes";
+import {of} from "rxjs";
+
+@Injectable()
+export class DrawingBoardGuard implements CanActivate {
+  constructor(private store: NgRedux<AppState>, private _http: HttpClient, private _router : Router) { }
+  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
+      let url : string = `/vid/roles/service_permissions?subscriberId=${next.queryParams['subscriberId']}&serviceType=${next.queryParams['serviceType']}`;
+      const viewMode = state.url.includes(DrawingBoardModes.RETRY_EDIT)? DrawingBoardModes.RETRY: DrawingBoardModes.VIEW;
+      return this._http.get(url)
+        .map((result : DrawingBoardPermissions) => {
+          if(!result.isEditPermitted){
+            this.navigateToNewViewEdit(next.queryParams, viewMode);
+            return false;
+          }else {
+            return true;
+          }
+        }).catch(err => {
+          this.navigateToNewViewEdit(next.queryParams, viewMode);
+          return of(false);
+        });
+  }
+
+  navigateToNewViewEdit(queryParams: any, mode: DrawingBoardModes): void{
+    this.store.dispatch(updateDrawingBoardStatus(mode));
+    const viewEditUrlTree = this.getNewViewEditUrlTree(queryParams, mode);
+    this._router.navigateByUrl(viewEditUrlTree);
+    window.parent.location.assign('../../serviceModels.htm#'+viewEditUrlTree.toString());
+  }
+
+  getNewViewEditUrlTree(queryParams: any, mode: DrawingBoardModes) {
+    return this._router.createUrlTree(
+      ['/servicePlanning/' +  mode],
+      {
+        queryParams:
+          {
+            serviceModelId: queryParams['serviceModelId'],
+            serviceInstanceId: queryParams['serviceInstanceId'],
+            serviceType : queryParams['serviceType'],
+            subscriberId : queryParams['subscriberId'],
+            jobId : queryParams['jobId'],
+          }
+      });
+  }
+}
+
+export class DrawingBoardPermissions {
+  isEditPermitted : boolean
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.html
new file mode 100644 (file)
index 0000000..91acca0
--- /dev/null
@@ -0,0 +1,47 @@
+<div class="available-models-tree" style="height: calc(100vh - 55px);">
+  <div class="models-tree-header">
+    <h5>
+      <span class="main" >MODEL <span class="sub-title">(from SDC)</span>:</span>
+      <span id="service-model-name">{{service | serviceInfo: _store: serviceModelId : 'name'}}</span>
+    </h5>
+    <search-component (updateNodes)="updateNodes($event)"
+                      [nodes]="nodes" [tree]="tree? tree: {}"
+                      [inputTestId]="'search-left-tree'"
+                      *ngIf="nodes?.length > 0"></search-component>
+  </div>
+  <div class="available-models-content-wrapper" *ngIf="nodes?.length > 0" >
+    <tree-root #tree [attr.data-tests-id]="'available-models-tree'" [nodes]="nodes" [options]="options" id="available-models-tree">
+      <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" title="{{node.data.type}}" [attr.data-tests-id]="'node-type-indicator'" >{{node?.data?.typeName}}</span>
+          <div class="model-info">
+          <span class="header-info">
+            <span class="property-name">
+              <span class="auto-name"
+                    [innerHtml]="getNodeName(node, filterValue) | safe : 'html'"
+                    [attr.data-tests-id]="'node-name'"
+              ></span>
+            </span>
+          </span>
+          </div>
+          <span class="actions">
+            <span class="number-button" *ngIf="node.data.getNodeCount(node, serviceModelId) > 0">
+              <span [attr.data-tests-id]="'numberButton'">{{node.data.getNodeCount(node, this.serviceModelId)}}</span>
+            </span>
+            <span class="icon-v" *ngIf="node?.data?.showNodeIcons(node, serviceModelId)?.vIcon">
+                <svg-icon
+                  [mode]="'secondary'"
+                  [name]="'maximum'">
+              </svg-icon>
+            </span>
+            <span class="icon-plus" *ngIf="node?.data?.showNodeIcons(node, serviceModelId)?.addIcon">
+              <span tooltip="Add" [attr.data-tests-id]="'node-'+node.data.name+'-add-btn'" (click)="onClickAdd(node, serviceModelId)">
+                <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/service-planning/available-models-tree/available-models-tree.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.scss
new file mode 100644 (file)
index 0000000..90c2cd8
--- /dev/null
@@ -0,0 +1,506 @@
+.tree-children.tree-children-no-padding { padding-left: 0 }
+.tree-children { padding-left: 20px; overflow: hidden }
+.node-drop-slot { display: block; height: 2px }
+.node-drop-slot.is-dragging-over { background: #ddffee; height: 20px; border: 2px dotted #888; }
+.toggle-children-wrapper-expanded .toggle-children { transform: rotate(90deg) }
+.toggle-children-wrapper-collapsed .toggle-children { transform: rotate(0); }
+.toggle-children-wrapper {
+  padding: 2px 3px 5px 1px;
+}
+/* tslint:disable */
+.toggle-children {
+  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAYAAABSO15qAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABAhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjY1RTYzOTA2ODZDRjExREJBNkUyRDg4N0NFQUNCNDA3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYzRkRFQjcxODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYzRkRFQjcwODUzNTExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTk5NzA1OGEtZDI3OC00NDZkLWE4ODgtNGM4MGQ4YWI1NzNmIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRkZmQxMGMtY2NlNS0xMTc4LWE5OGQtY2NkZmM5ODk5YWYwIi8+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+Z2x5cGhpY29uczwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+5iogFwAAAGhJREFUeNpiYGBgKABigf///zOQg0EARH4A4gZyDIIZ8B/JoAJKDIDhB0CcQIkBRBtEyABkgxwoMQCGD6AbRKoBGAYxQgXIBRuZGKgAKPIC3QLxArnRSHZCIjspk52ZKMrOFBUoAAEGAKnq593MQAZtAAAAAElFTkSuQmCC');
+  height: 8px;
+  width: 9px;
+  background-size: contain;
+  display: inline-block;
+  position: relative;
+  top: 1px;
+  background-repeat: no-repeat;
+  background-position: center;
+}
+.toggle-children-placeholder {
+  display: inline-block;
+  height: 10px;
+  width: 10px;
+  position: relative;
+  top: 1px;
+  padding-right: 3px;
+}
+.node-content-wrapper {
+  display: inline-block;
+  padding: 2px 5px;
+  border-radius: 2px;
+  transition: background-color .15s,box-shadow .15s;
+}
+.node-wrapper {display: flex; align-items: flex-start;}
+.node-content-wrapper-active,
+.node-content-wrapper.node-content-wrapper-active:hover,
+.node-content-wrapper-active.node-content-wrapper-focused {
+  background: #beebff;
+}
+.node-content-wrapper-focused { background: #e7f4f9 }
+.node-content-wrapper:hover { background: #f7fbff }
+.node-content-wrapper-active, .node-content-wrapper-focused, .node-content-wrapper:hover {
+  box-shadow: inset 0 0 1px #999;
+}
+.node-content-wrapper.is-dragging-over { background: #ddffee; box-shadow: inset 0 0 1px #999; }
+.node-content-wrapper.is-dragging-over-disabled { opacity: 0.5 }
+
+tree-viewport {
+  height: 100%;
+  overflow: auto;
+  display: block;
+}
+.tree-children { padding-left: 20px }
+.empty-tree-drop-slot .node-drop-slot { height: 20px; min-width: 100px }
+.angular-tree-component {
+  width: 100%;
+  position:relative;
+  display: inline-block;
+  cursor: pointer;
+  -webkit-touch-callout: none; /* iOS Safari */
+  -webkit-user-select: none;   /* Chrome/Safari/Opera */
+  -khtml-user-select: none;    /* Konqueror */
+  -moz-user-select: none;      /* Firefox */
+  -ms-user-select: none;       /* IE/Edge */
+  user-select: none;           /* non-prefixed version, currently not supported by any browser */
+}
+
+tree-root .angular-tree-component-rtl {
+  direction: rtl;
+}
+tree-root .angular-tree-component-rtl .toggle-children-wrapper-collapsed .toggle-children {
+  transform: rotate(180deg) !important;
+}
+tree-root .angular-tree-component-rtl .tree-children {
+  padding-right: 20px;
+  padding-left: 0;
+}
+
+tree-node-checkbox {
+  padding: 1px;
+}
+
+
+available-models-tree {
+  height: 100%;
+  &.left-side{
+    background: #F2F2F2;
+    padding: 0;
+    border-right: #D2D2D2 1px solid;
+    max-width: 690px;
+  }
+
+  .available-models-tree {
+    display: flex;
+    flex-direction: column;
+    line-height: 14px;
+    min-width: 340px;
+    padding: 30px;
+    height: 100%;
+    .models-tree-header {
+      display: flex;
+      justify-content: space-between;
+
+      h5 {
+        margin: 0;
+        font-family: OpenSans-Semibold;
+        color: #191919;
+        font-size: 16px;
+
+        span {
+          vertical-align: middle;
+          display: inline-block;
+          font-size: 16px;
+          color: #191919;
+          line-height: 16px;
+          &.sub-title {
+            font-family: OpenSans-Regular;
+            font-size: 14px;
+            color: #0D0D0D;
+          }
+        }
+
+        #service-model-name {
+          padding-top: 5px;
+          display: block;
+          font-size: 14px;
+        }
+      }
+
+      .search-container {
+        width: 275px;
+      }
+    }
+    .available-models-content-wrapper {
+      flex: 1;
+      display: flex;
+      flex-direction: column;
+      margin-top: 20px;
+
+
+      tree-root {
+        flex: 1;
+        display: flex;
+      }
+      tree-viewport {
+        flex: 1;
+        .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: #191919;
+                .node-content-wrapper.node-content-wrapper-focused {
+                  tree-node-content {
+                    > div {
+                      background: #009FDB;
+                      color: white;
+                    }
+                  }
+                }
+                .node-content-wrapper {
+                  tree-node-content {
+                    > div {
+                      background: #F2F2F2;
+                      &.tree-node-focused:not(.tree-node-disabled) {
+                        background: #009FDB;
+                        color: white;
+                      }
+                      span.actions {
+                        .icon-plus{
+                          display: block;
+                          color: #009FDB;
+                          span:before {
+                            display: inline-block;
+                            color: #5A5A5A;
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+          &.tree-node-focused:not(.tree-node-disabled)  {
+            & > tree-node-wrapper {
+              .node-wrapper {
+                border-color:  #1EB9F3;
+                .node-content-wrapper{
+                  background: #009FDB;
+                  border-color: #1EB9F3;
+                }
+                .node-content-wrapper-focused{
+                  box-shadow: none;
+                  tree-node-content {
+
+                    .vf-type{
+                      color: #ffffff;
+                      border-color: #1EB9F3;
+                    }
+                    > div {
+                      span.actions {
+                        .icon-plus {
+                          color: #ffffff;
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+          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;
+                    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-family: OpenSans-SemiBold;
+                            font-size: 13px;
+                            color: #5A5A5A;
+                            line-height: 16px;
+                          }
+                        }
+                        .icon-plus {
+                          display: none;
+                          width: 45px;
+                          font-size: 22px;
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+
+            }
+          }
+        }
+        & > tree-node-collection > tree-node > .node-wrapper{
+          //border-top: 1px solid #D2D2D2;
+        }
+      }
+
+    }
+  }
+}
+.highlight {
+  background-color: #9DD9EF;
+}
+
+#drawing-board-tree{
+  .tree-node.tree-node-expanded.tree-node-focused {
+  }
+}
+
+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;
+  }
+
+
+  .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-node.tree-node-expanded {
+    margin-bottom: 10px;
+  }
+  .tree-node-collapsed {
+    margin-bottom: 10px;
+  }
+  .tree-children {
+    padding-left: 0;
+  }
+
+  tree-node-content .actions .number-button {
+    height: 45px;
+    padding-top: 14px;
+    border-right: 1px solid #D2D2D2;
+    border-left: 1px solid #D2D2D2;
+    padding-left: 0;
+    span {
+      background: none;
+      font-size: 11px;
+      color: #5A5A5A;
+    }
+  }
+
+  .node-content-wrapper.node-content-wrapper-focused{
+     border-color:#1EB9F3 ;
+     tree-node-content > div{
+       .vf-type,.model-info,.model-info .property-name {
+         color: white;
+       }
+      .number-button{
+        border-color: #1EB9F3 ;
+        span{
+          color: white !important;
+        }
+      }
+
+    }
+  }
+
+
+
+  .vf-type {
+    width: 40px;
+    height: 45px;
+    padding-top: 16px;
+    border-right: 1px solid #D2D2D2;
+    color: #959595;
+    font-size: 13px;
+    font-family: OpenSans-SemiBold;
+    text-transform: uppercase;
+    text-align: center;
+    flex-basis: 40px;
+    flex-grow: 0;
+    flex-shrink: 0;
+  }
+
+  .isParent {
+    width: 100%;
+    padding-left: 0 !important;
+  }
+  .model-info {
+    padding-left: 16px;
+    width: 100%;
+    .property-name {
+      font-family: OpenSans-Regular;
+      font-size: 12px;
+      line-height: 12px;
+      color: #191919;
+      //text-transform: capitalize;  problematic with search
+      .auto-name{
+        display: inline-flex;//required for search more then one sub highlight
+      }
+    }
+
+    tree-node-header-properties {
+      display: none;
+    }
+  }
+
+  .span-name {
+    margin-right: auto;
+    padding-left: 10px;
+  }
+
+  .toggle-children-wrapper.toggle-children-wrapper-expanded {
+    .toggle-children:before {
+      color: #009FDB;
+    }
+  }
+
+  .tree-node.tree-node-expanded .tree-children {
+  }
+
+  .tree-node.tree-node-expanded.tree-node-focused .tree-children {
+
+  }
+
+  .tree-node.tree-node-expanded > tree-node-wrapper{
+    box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);
+    position: relative;
+    z-index: 1;
+    display: block;
+  }
+
+  .tree-node-leaf .node-wrapper{
+    margin-left: 46px;
+    border-left: none;
+  }
+  .tree-children .tree-node-leaf .node-wrapper{
+    margin-left: 86px;
+  }
+}
+
+@media (max-width: 992px)  {
+  available-models-tree{
+    //width: 40%;
+    max-width: 690px;
+  }
+  drawing-board-tree{
+    //width: 60%;
+  }
+}
+
+@media (min-width: 992px)  {
+  available-models-tree{
+    //width: 50%;
+    max-width: 650px;
+  }
+  drawing-board-tree{
+    //width: 50%;
+  }
+}
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.component.ts
new file mode 100644 (file)
index 0000000..31d7b03
--- /dev/null
@@ -0,0 +1,167 @@
+import {Component, EventEmitter, Output, ViewChild} from '@angular/core';
+import {ITreeOptions, TreeComponent} from 'angular-tree-component';
+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 '../../../shared/store/reducers';
+import {AaiService} from '../../../shared/services/aaiService/aai.service';
+import {ServiceNodeTypes} from '../../../shared/models/ServiceNodeTypes';
+import {IframeService} from "../../../shared/utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {createVFModuleInstance} from "../../../shared/storeUtil/utils/vfModule/vfModule.actions";
+import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import {DrawingBoardTreeService} from "../drawing-board-tree/drawing-board-tree.service";
+import {ObjectToModelTreeService} from "../objectsToTree/objectToModelTree/objectToModelTree.service";
+import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {SharedTreeService} from "../objectsToTree/shared.tree.service";
+import {changeInstanceCounter} from "../../../shared/storeUtil/utils/general/general.actions";
+import {createVnfGroupInstance} from "../../../shared/storeUtil/utils/vnfGroup/vnfGroup.actions";
+import {VnfGroupControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {HighlightPipe} from "../../../shared/pipes/highlight/highlight-filter.pipe";
+import * as _ from 'lodash';
+import {DrawingBoardTreeComponent} from "../drawing-board-tree/drawing-board-tree.component";
+
+
+@Component({
+  selector: 'available-models-tree',
+  templateUrl: './available-models-tree.component.html',
+  styleUrls: ['./available-models-tree.component.scss'],
+  providers : [HighlightPipe]
+})
+
+export class AvailableModelsTreeComponent {
+  filterValue : string = '';
+  serviceModelId: string;
+  serviceHierarchy;
+  parentElementClassName = 'content';
+  _store: NgRedux<AppState>;
+  isNewObject: boolean;
+  availableModelsTreeService: AvailableModelsTreeService;
+  drawingBoardTreeService: DrawingBoardTreeService;
+
+  constructor(private _iframeService: IframeService,
+              private _aaiService: AaiService,
+              private route: ActivatedRoute,
+              private dialogService: DialogService,
+              private _availableModelsTreeService: AvailableModelsTreeService,
+              private _drawingBoardTreeService: DrawingBoardTreeService,
+              private _defaultDataGeneratorService: DefaultDataGeneratorService,
+              private _vnfGroupControlGenerator: VnfGroupControlGenerator,
+              private _vfModulePopuopService: VfModulePopuopService,
+              private _vnfGroupPopupService: VnfGroupPopupService,
+              private _vnfPopupService: VnfPopupService,
+              private _networkPopupService: NetworkPopupService,
+              private  store: NgRedux<AppState>,
+              private _objectToModelTreeService : ObjectToModelTreeService,
+              private  _sharedTreeService : SharedTreeService,
+              private _highlightPipe : HighlightPipe) {
+    this.availableModelsTreeService = _availableModelsTreeService;
+    this.drawingBoardTreeService = _drawingBoardTreeService;
+
+    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._objectToModelTreeService.convertServiceHierarchyModelToTreeNodes(this.serviceHierarchy);
+          },
+          error => {
+            console.log('error is ', error)
+          }
+        );
+      });
+
+  }
+
+  @Output()
+  highlightInstances: EventEmitter<number> = new EventEmitter<number>();
+  @ViewChild('tree') tree: TreeComponent;
+
+  nodes = [];
+  service = {name: ''};
+
+  options: ITreeOptions = {
+    nodeHeight: 36,
+    dropSlotHeight: 0,
+    nodeClass: (node: ITreeNode) => {
+      if (node.data.type === ServiceNodeTypes.VFmodule && ! node.parent.data['getNodeCount'](node.parent, this.serviceModelId) && this.store.getState().global.drawingBoardStatus !== DrawingBoardModes.VIEW) {
+        node.data.disabled = true;
+        return 'tree-node tree-node-disabled';
+      }
+      node.data.disabled = false;
+      return 'tree-node';
+    }
+  };
+
+
+  getNodeName(node : ITreeNode, filter : string) {
+    return this._highlightPipe.transform(node.data.name ,filter ? filter : '');
+  }
+
+  expandParentByNodeId(id: IDType): void {
+    this.tree.treeModel.getNodeById(id).parent.expand();
+  }
+
+  updateNodes(updateData : {nodes : any, filterValue : string}) : void {
+    this.nodes = updateData.nodes;
+    this.filterValue = updateData.filterValue;
+  }
+
+  selectNode(node: ITreeNode): void {
+    node.expand();
+    this._sharedTreeService.setSelectedVNF(null);
+    this.highlightInstances.emit(node.data.modelUniqueId);
+  }
+
+
+
+  onClickAdd(node: ITreeNode, serviceId: string ,  isNewObject: boolean = false): void {
+    this.isNewObject = isNewObject;
+    let data = node.data;
+    let dynamicInputs = data.dynamicInputs;
+    let isAlaCarte: boolean = this.serviceHierarchy.service.instantiationType == "A-La-Carte";
+    let isEcompGeneratedNaming: boolean = data.isEcompGeneratedNaming;
+    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, isEcompGeneratedNaming)) {
+      this._iframeService.addClassOpenModal(this.parentElementClassName);
+      node.data.onAddClick(node, serviceId);
+    } else {
+      if (node.data.type === ServiceNodeTypes.VnfGroup)  {
+        let instanceName = this._vnfGroupControlGenerator.getDefaultInstanceName(null, serviceId, node.data.name);
+        let vnfGroup = this._defaultDataGeneratorService.generateVnfGroupInstance(this.serviceHierarchy.vnfGroups[node.data.name], isEcompGeneratedNaming, isAlaCarte, instanceName);
+        this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceId, 1 , <any> {data: {type: 'VnfGroup'}}));
+        this._store.dispatch(createVnfGroupInstance(vnfGroup, node.data.name, serviceId, node.data.name));
+        DrawingBoardTreeComponent.triggerreCalculateIsDirty.next(this.serviceModelId);
+      } else {
+        let vfModule = this._defaultDataGeneratorService.generateVFModule(this.serviceHierarchy.vnfs[node.parent.data.name].vfModules[node.data.name], dynamicInputs, isEcompGeneratedNaming, isAlaCarte);
+        if (this._sharedTreeService.selectedVNF) {
+          this.store.dispatch(createVFModuleInstance(vfModule, node.data.name, this.serviceModelId, null, this._sharedTreeService.selectedVNF));
+          DrawingBoardTreeComponent.triggerreCalculateIsDirty.next(this.serviceModelId);
+        } else if (this._availableModelsTreeService.getOptionalVNFs(this.serviceModelId, node.parent.data.name).length === 1) {
+          let existVnf = this._store.getState().service.serviceInstance[this.serviceModelId].vnfs;
+          if(!_.isNil(existVnf)){
+            for(let vnfKey in existVnf){
+              if(existVnf[vnfKey]['modelInfo'].modelUniqueId === node.parent.data.id){
+                this.store.dispatch(createVFModuleInstance(vfModule, node.data.name, this.serviceModelId, null, vnfKey));
+                DrawingBoardTreeComponent.triggerreCalculateIsDirty.next(this.serviceModelId);
+              }
+            }
+          }
+
+
+        } else {
+          this._availableModelsTreeService.addingAlertAddingNewVfModuleModal();
+        }
+      }
+    }
+  }
+}
@@ -3,85 +3,62 @@ 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";
+import {AvailableModelsTreeService, AvailableNodeIcons} from './available-models-tree.service';
+import {ServiceNodeTypes} from "../../../shared/models/ServiceNodeTypes";
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service";
+import {MessageBoxData} from "../../../shared/components/messageBox/messageBox.data";
+import {SdcUiCommon} from "onap-ui-angular";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {SharedTreeService} from "../objectsToTree/shared.tree.service";
 
 describe('Available Models Tree Service', () => {
+
   let injector;
   let service: AvailableModelsTreeService;
   let httpMock: HttpTestingController;
 
-  beforeEach(() => {
-
+  beforeAll(done => (async () => {
     TestBed.configureTestingModule({
-      imports: [HttpClientTestingModule],
+      imports: [HttpClientTestingModule, NgReduxTestingModule],
       providers: [AvailableModelsTreeService,
-        ServicePlanningService,
-        {provide: NgRedux, useClass: MockAppStore}]
+        DefaultDataGeneratorService,
+        SharedTreeService,
+        MockNgRedux]
     });
+    await TestBed.compileComponents();
+      injector = getTestBed();
+      service = injector.get(AvailableModelsTreeService);
+      httpMock = injector.get(HttpTestingController);
+  })().then(done).catch(done.fail));
 
-    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'
-        }
-      };
+  test('addingAlertAddingNewVfModuleModal should open message modal', () => {
+    jest.spyOn(MessageBoxService.openModal, 'next');
+    service.addingAlertAddingNewVfModuleModal();
 
-      let serviceHierarchy = getSericeServiceHierarchy();
-      let result = service.shouldShowAddIcon(treeNode, serviceHierarchy, '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 2);
-      expect(result).toBeFalsy();
-      done();
-    });
+    expect(MessageBoxService.openModal.next).toHaveBeenCalledWith(new MessageBoxData(
+      "Select a parent",  // modal title
+      "There are multiple instances on the right side that can contain this vf-module Please select the VNF instance, to add this vf-module to, on the right side and then click the + sign",
+      SdcUiCommon.ModalType.warning,
+      SdcUiCommon.ModalSize.medium,
+      [
+        {text: "Close", size: "medium", closeModal: true}
+      ]));
+  });
 
-    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();
+    let serviceHierarchy = getServiceServiceHierarchy();
 
-    it('should open popup on add instance', (done: DoneFn) => {
+    test('should open popup on add instance', () => {
       // add vnf should return true
-      let result = service.shouldOpenDialog(ServiceNodeTypes.VF, [], false);
+      let result = service.shouldOpenDialog(ServiceNodeTypes.VF, [], true);
       expect(result).toBeTruthy();
 
       //  add vfModule with user provided naming should return true
-      result = service.shouldOpenDialog(ServiceNodeTypes.VFmodule, [], true);
+      result = service.shouldOpenDialog(ServiceNodeTypes.VFmodule, [], false);
       expect(result).toBeTruthy();
 
       //  add vfModule with dynamicInputs without defaultValues should return true
@@ -91,7 +68,7 @@ describe('Available Models Tree Service', () => {
         name: '2017488_adiodvpe0_vnf_config_template_version',
         isRequired: true,
         description: 'VPE Software Version'
-      }], false);
+      }], true);
       expect(result).toBeTruthy();
 
       // add vfModule with dynamicInputs with defaultValues should return false
@@ -102,13 +79,12 @@ describe('Available Models Tree Service', () => {
         value: '17.2',
         isRequired: true,
         description: 'VPE Software Version'
-      }], false);
+      }], true);
       expect(result).toBeFalsy();
-      done();
     });
   });
 
-  function getSericeServiceHierarchy() {
+  function getServiceServiceHierarchy() {
     return JSON.parse(JSON.stringify(
       {
         '6e59c5de-f052-46fa-aa7e-2fca9d674c44': {
@@ -118,7 +94,7 @@ describe('Available Models Tree Service', () => {
             'name': 'ComplexService',
             'version': '1.0',
             'toscaModelURL': null,
-            'category': 'Mobility',
+            'category': 'Emanuel',
             'serviceType': '',
             'serviceRole': '',
             'description': 'ComplexService',
@@ -137,7 +113,9 @@ describe('Available Models Tree Service', () => {
               'inputs': {},
               'commands': {},
               'properties': {
-                'gpb2_Internal2_mac': '00:80:37:0E:02:22',
+                'max_instances': '3',
+                'min_instances': '1',
+                'gpb2_Internal2_mac': '00:11:22:EF:AC:DF',
                 'sctp-b-ipv6-egress_src_start_port': '0',
                 'sctp-a-ipv6-egress_rule_application': 'any',
                 'Internal2_allow_transit': 'true',
@@ -145,9 +123,9 @@ describe('Available Models Tree Service', () => {
                 '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',
+                'ncb2_Internal1_mac': '00:11:22:EF:AC:DF',
                 'sctp-b-ipv6-ingress-src_start_port': '0.0',
-                'ncb1_Internal2_mac': '00:80:37:0E:09:12',
+                'ncb1_Internal2_mac': '00:11:22:EF:AC:DF',
                 'fsb_volume_size_0': '320.0',
                 'sctp-b-egress_src_addresses': 'local',
                 'sctp-a-ipv6-ingress_ethertype': 'IPv4',
@@ -166,12 +144,12 @@ describe('Available Models Tree Service', () => {
                 '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',
+                'gpb1_Internal1_mac': '00:11:22:EF:AC:DF',
                 'sctp-b-egress_dst_subnet_prefix_len': '0.0',
-                'Internal2_net_cidr': '169.255.0.0',
+                'Internal2_net_cidr': '10.0.0.10',
                 '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',
+                'fsb1_Internal2_mac': '00:11:22:EF:AC:DF',
                 'sctp-a-egress_ethertype': 'IPv4',
                 'vlc_st_service_mode': 'in-network-nat',
                 'sctp-a-ipv6-egress_ethertype': 'IPv4',
@@ -181,17 +159,17 @@ describe('Available Models Tree Service', () => {
                 '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',
+                'fsb2_Internal1_mac': '00:11:22:EF:AC:DF',
                 'sctp-a-ipv6-ingress-src_start_port': '0.0',
                 'sctp-b-ipv6-egress_ethertype': 'IPv4',
-                'Internal1_net_cidr': '169.253.0.0',
+                'Internal1_net_cidr': '10.0.0.10',
                 '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',
+                'vlc2_Internal1_mac': '00:11:22:EF:AC:DF',
                 'vlc_st_virtualization_type': 'virtual-machine',
                 'sctp-b-ingress-dst_start_port': '0.0',
                 'sctp-b-ingress-dst_end_port': '65535.0',
@@ -209,7 +187,7 @@ describe('Available Models Tree Service', () => {
                 'Internal2_shared': 'false',
                 'sctp-a-ipv6-egress_dst_subnet_prefix_len': '0',
                 'Internal2_rpf': 'disable',
-                'vlc1_Internal1_mac': '00:80:37:0E:01:12',
+                'vlc1_Internal1_mac': '00:11:22:EF:AC:DF',
                 'sctp-b-ipv6-egress_src_end_port': '65535',
                 'sctp-a-ipv6-egress_src_addresses': 'local',
                 'sctp-a-ingress-dst_end_port': '65535.0',
@@ -219,41 +197,41 @@ describe('Available Models Tree Service', () => {
                 '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',
+                'ncb1_Internal1_mac': '00:11:22:EF:AC:DF',
                 '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',
+                'fsb2_Internal2_mac': '00:11:22:EF:AC:DF',
                 'sctp-b-egress_dst_subnet_prefix': '0.0.0.0',
                 'Internal1_net_cidr_len': '17',
-                'gpb2_Internal1_mac': '00:80:37:0E:02:22',
+                'gpb2_Internal1_mac': '00:11:22:EF:AC:DF',
                 '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',
+                'ncb2_Internal2_mac': '00:11:22:EF:AC:DF',
                 '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',
+                'gpb1_Internal2_mac': '00:11:22:EF:AC:DF',
                 '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',
+                'fsb1_Internal1_mac': '00:11:22:EF:AC:DF',
                 'vlc_st_interface_type_oam': 'management',
                 'multi_stage_design': 'false',
                 'oam_sec_group_name': 'oam-sec-group',
-                'Internal2_net_gateway': '169.255.0.3',
+                'Internal2_net_gateway': '10.0.0.10',
                 'sctp-a-ipv6-ingress-dst_end_port': '65535',
                 'sctp-b-ipv6-egress-dst_start_port': '0',
-                'Internal1_net_gateway': '169.253.0.3',
+                'Internal1_net_gateway': '10.0.0.10',
                 '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',
@@ -275,7 +253,7 @@ describe('Available Models Tree Service', () => {
                 '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',
+                'vlc2_Internal2_mac': '00:11:22:EF:AC:DF',
                 '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',
@@ -287,7 +265,7 @@ describe('Available Models Tree Service', () => {
                 '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',
+                'vlc1_Internal2_mac': '00:11:22:EF:AC:DF',
                 'sctp-a-ingress-src_subnet_prefix': '0.0.0.0',
                 'sctp-a-ipv6-ingress_action': 'pass',
                 'Internal1_rpf': 'disable',
@@ -446,5 +424,4 @@ describe('Available Models Tree Service', () => {
       }
     ));
   }
-
 });
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/available-models-tree/available-models-tree.service.ts
new file mode 100644 (file)
index 0000000..dc72f8f
--- /dev/null
@@ -0,0 +1,76 @@
+import {Injectable} from '@angular/core';
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {MessageBoxData} from "../../../shared/components/messageBox/messageBox.data";
+import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service";
+import * as _ from "lodash";
+import { SdcUiCommon} from "onap-ui-angular";
+import {SharedTreeService} from "../objectsToTree/shared.tree.service";
+
+export class AvailableNodeIcons {
+   addIcon: boolean;
+   vIcon: boolean;
+
+  constructor(addIcon: boolean, vIcon: boolean) {
+    this.addIcon = addIcon;
+    this.vIcon = vIcon;
+  }
+}
+
+@Injectable()
+export class AvailableModelsTreeService {
+  constructor(private _defaultDataGeneratorService: DefaultDataGeneratorService,
+              private store: NgRedux<AppState>,
+              public _shareTreeService : SharedTreeService) {
+  }
+
+
+
+  shouldOpenDialog(type: string, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+    if (!isEcompGeneratedNaming || this._defaultDataGeneratorService.requiredFields[type].length > 0) {
+      return true;
+    }
+
+    if (dynamicInputs) {
+      for(let input of dynamicInputs) {
+        if (input.isRequired && _.isEmpty(input.value)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  getOptionalVNFs(serviceUUID: string, vnfOriginalModelName : string) : any[] {
+    let result = [];
+    if(!_.isNil(this.store.getState().service.serviceInstance) && !_.isNil(this.store.getState().service.serviceInstance[serviceUUID])){
+      const serviceVNFsInstances = this.store.getState().service.serviceInstance[serviceUUID].vnfs;
+      for(let vnfKey in serviceVNFsInstances){
+        if(serviceVNFsInstances[vnfKey].originalName === vnfOriginalModelName){
+          serviceVNFsInstances[vnfKey].vnfStoreKey = vnfKey;
+          result.push(serviceVNFsInstances[vnfKey]);
+        }
+      }
+    }
+
+
+    return result;
+  }
+
+
+
+  addingAlertAddingNewVfModuleModal() : void {
+    let messageBoxData : MessageBoxData = new MessageBoxData(
+      "Select a parent",  // modal title
+      "There are multiple instances on the right side that can contain this vf-module Please select the VNF instance, to add this vf-module to, on the right side and then click the + sign",
+      SdcUiCommon.ModalType.warning,
+      SdcUiCommon.ModalSize.medium,
+      [
+        {text:"Close", size:"medium", closeModal:true}
+      ]);
+
+    MessageBoxService.openModal.next(messageBoxData);
+  }
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info-model.ts
new file mode 100644 (file)
index 0000000..4c5bf67
--- /dev/null
@@ -0,0 +1,26 @@
+import {ModelInformationItem} from "../../../shared/components/model-information/model-information.component";
+
+export class ComponentInfoModel {
+  type: ComponentInfoType;
+  modelInfoItems: ModelInformationItem[];
+  additionalInfoItems: ModelInformationItem[];
+  title: string;
+
+
+  constructor(type: ComponentInfoType, modelInfoItems: ModelInformationItem[], additionalInfoItems: ModelInformationItem[], isInstance:boolean=true) {
+    this.type = type;
+    this.modelInfoItems = modelInfoItems;
+    this.additionalInfoItems = additionalInfoItems;
+    this.title=this.type+(isInstance ? " Instance" : "");
+  }
+}
+
+
+export enum ComponentInfoType {
+  SERVICE = "Service",
+  VNF = "VNF",
+  NETWORK = "Network",
+  VFMODULE = "VFModule",
+  VNFGROUP = "Group",
+  VNFMEMBER = "VNF"
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.html
new file mode 100644 (file)
index 0000000..8f08de0
--- /dev/null
@@ -0,0 +1,20 @@
+<div *ngIf="componentInfoModel">
+  <div class="component-info-wrapper"  [attr.data-tests-id]="'component-info-wrapper'">
+    <div class="component-info-section" [attr.data-tests-id]="'component-info-section'">
+      <div class="title" [attr.data-tests-id]="'component-info-section-title'">{{componentInfoModel?.title}} INFO</div>
+      <div class="component-info-list"  [attr.data-tests-id]="'component-info-section-list'">
+        <model-information [modelInformationItems]="componentInfoModel?.modelInfoItems" [itemClass]="'componentInfoItem'"></model-information>
+      </div>
+    </div>
+  </div>
+  <!-- commented out till we will have a data to show in additional info
+  <div class="component-info-wrapper" [attr.data-tests-id]="'additional-info-wrapper'">-->
+    <!--<div class="component-info-section" [attr.data-tests-id]="'additional-info-section'">-->
+      <!--<div class="title" [attr.data-tests-id]="'additional-info-section-title'">ADDITIONAL INFO</div>-->
+      <!--<div class="component-info-list" [attr.data-tests-id]="'additional-info-section-title'">-->
+        <!--<model-information [modelInformationItems]="componentInfoModel.additionalInfoItems" [itemClass]="'componentInfoItem'"></model-information>-->
+      <!--</div>-->
+    <!--</div>-->
+  <!--</div>
+  -->
+</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.scss
new file mode 100644 (file)
index 0000000..2d77356
--- /dev/null
@@ -0,0 +1,40 @@
+.component-info-wrapper {
+
+  &:first-child {
+    border-bottom: 1px solid #D2D2D2;
+  }
+  .component-info-section {
+    margin: 15px 25px 0 25px;
+
+    .title {
+      font-family: OpenSans-SemiBold;
+      font-size: 14px;
+      color: #191919;
+      text-transform: uppercase;
+      margin-bottom: 15px;
+    }
+  }
+
+}
+
+:host ::ng-deep .componentInfoItem {
+  border-top: 1px solid #D2D2D2;
+  padding-top: 10px;
+  margin-bottom: 10px;
+
+  label {
+    font-family: OpenSans-Regular;
+    font-size: 12px;
+    color: #5A5A5A;
+    text-transform: capitalize;
+  }
+
+  .model-item-value {
+    font-family:  OpenSans-SemiBold;
+    font-size: 14px;
+    color: #191919;
+    line-height: 16px;
+  }
+}
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.component.ts
new file mode 100644 (file)
index 0000000..c69ab52
--- /dev/null
@@ -0,0 +1,40 @@
+import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';
+import {ComponentInfoService} from "./component-info.service";
+import {ComponentInfoModel, ComponentInfoType} from "./component-info-model";
+import {ActivatedRoute} from "@angular/router";
+
+
+@Component({
+  selector: 'component-info',
+  templateUrl: './component-info.component.html',
+  styleUrls: ['./component-info.component.scss'],
+  changeDetection: ChangeDetectionStrategy.OnPush
+})
+export class ComponentInfoComponent implements OnInit {
+  componentInfoModel: ComponentInfoModel = null;
+
+  constructor(private _componentInfoService:ComponentInfoService, private route: ActivatedRoute) {}
+
+  ngOnInit() {
+    ComponentInfoService.triggerComponentInfoChange.subscribe((input : ComponentInfoModel) => {
+        if(input.type === ComponentInfoType.SERVICE){
+          this.getServiceInformation();
+        }else {
+          this.componentInfoModel = input;
+        }
+      });
+
+    this.getServiceInformation();
+  }
+
+
+
+  getServiceInformation() : void {
+    this.route
+      .queryParams
+      .subscribe(params => {
+        let serviceModelId = params['serviceModelId'];
+        this.componentInfoModel = this._componentInfoService.getInfoForService(serviceModelId);
+      });
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.spec.ts
new file mode 100644 (file)
index 0000000..8b0da40
--- /dev/null
@@ -0,0 +1,93 @@
+import {ComponentInfoService} from './component-info.service';
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {MockNgRedux, NgReduxTestingModule} from '@angular-redux/store/testing';
+import {NgRedux} from '@angular-redux/store';
+import {AaiService} from '../../../shared/services/aaiService/aai.service';
+import {HttpClient, HttpHandler} from '@angular/common/http';
+import {FeatureFlagsService} from '../../../shared/services/featureFlag/feature-flags.service';
+import {ModelInformationItem} from "../../../shared/components/model-information/model-information.component";
+import {ComponentInfoModel, ComponentInfoType} from "./component-info-model";
+
+class MockAppStore<T> {
+  getState() {
+    return {
+      global: {
+      },
+      service : {
+        serviceHierarchy : {
+          '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd' : {
+            service:{
+              serviceRole: 'Testing',
+              serviceType: 'pnf',
+              uuid: '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd',
+              version: '1.0',
+              customizationUuid: ''
+            }
+          }
+        },
+        serviceInstance : {
+          '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd' : {
+            globalSubscriberId: 'e433710f-9217-458d-a79d-1c7aff376d89',
+            subscriptionServiceType:'TYLER SILVIA',
+            instanceId: '2f7130e8-27d6-4c01-8988-60ca67e8dae4'
+          }
+        },
+        subscribers: [
+          {
+            'id': 'CAR_2020_ER',
+            'name': 'CAR_2020_ER',
+            'isPermitted': true
+          },  
+          {
+            'id': 'e433710f-9217-458d-a79d-1c7aff376d89',
+            'name': 'SILVIA ROBBINS',
+            'isPermitted': true
+          }
+        ]
+      }
+    }
+  }
+}
+
+beforeAll(done => (async () => {
+  TestBed.configureTestingModule({
+    imports: [NgReduxTestingModule],
+    providers: [
+      AaiService,
+      HttpClient,
+      HttpHandler,
+      FeatureFlagsService,
+      ComponentInfoService,
+      {provide: NgRedux, useClass: MockAppStore},
+      MockNgRedux]
+  });
+  await TestBed.compileComponents();
+  let injector = getTestBed();
+  service = injector.get(ComponentInfoService);
+  })().then(done).catch(done.fail));
+
+let service: ComponentInfoService;
+describe('Service Info Data', () => {
+
+  test('ComponentInfoService should be defined', () => {
+    expect(service).toBeDefined();
+  });
+
+  test('Info for service should be correct', () => {
+    let actualServiceInfo = service.getInfoForService('1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+    let expectedServiceInfo = [
+      ModelInformationItem.createInstance('Type', 'pnf'),
+      ModelInformationItem.createInstance('Model Version', '1.0'),
+      ModelInformationItem.createInstance('Model Customization ID', ''),
+      ModelInformationItem.createInstance('Instance ID', '2f7130e8-27d6-4c01-8988-60ca67e8dae4'),
+      ModelInformationItem.createInstance('Subscriber Name', 'SILVIA ROBBINS'),
+      ModelInformationItem.createInstance('Service Type', 'TYLER SILVIA'),
+      ModelInformationItem.createInstance('Service Role', 'Testing'),
+    ];
+    expect(actualServiceInfo).toEqual(new ComponentInfoModel(ComponentInfoType.SERVICE, expectedServiceInfo, []));
+
+
+  });
+
+});
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/component-info/component-info.service.ts
new file mode 100644 (file)
index 0000000..9318b3a
--- /dev/null
@@ -0,0 +1,41 @@
+import {Injectable} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {AaiService} from "../../../shared/services/aaiService/aai.service";
+import {Subject} from "rxjs";
+import {ComponentInfoModel, ComponentInfoType} from "./component-info-model";
+import {ModelInformationItem} from "../../../shared/components/model-information/model-information.component";
+import * as _ from 'lodash';
+@Injectable()
+export class ComponentInfoService {
+  static triggerComponentInfoChange: Subject<ComponentInfoModel> = new Subject<ComponentInfoModel>();
+  constructor( private _store: NgRedux<AppState>, private _aaiService : AaiService){ }
+
+  getInfoForService(serviceModelId):ComponentInfoModel {
+    if(_.isNil(this._store.getState().service.serviceHierarchy[serviceModelId])) return null;
+
+    let serviceHierarchy = this._store.getState().service.serviceHierarchy[serviceModelId].service;
+    const serviceInstance = this._store.getState().service.serviceInstance[serviceModelId];
+    const modelInfoItems: ModelInformationItem[] = [
+     ModelInformationItem.createInstance("Subscriber Name",this._aaiService.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)),
+     ModelInformationItem.createInstance("Service Type",serviceInstance.subscriptionServiceType),
+     ModelInformationItem.createInstance("Service Role",serviceHierarchy.serviceRole),
+    ];
+    serviceHierarchy.type = serviceHierarchy.serviceType;
+    return this.addGeneralInfoItems(modelInfoItems, ComponentInfoType.SERVICE, serviceHierarchy, serviceInstance );
+  }
+
+
+  addGeneralInfoItems(modelInfoSpecificItems: ModelInformationItem[], type: ComponentInfoType, model, instance) {
+    let modelInfoItems: ModelInformationItem[] = [
+      ModelInformationItem.createInstance("Type", (model && model.type) ? model.type : ((instance && instance.modelInfo) ? instance.modelInfo.modelType : null)),
+      ModelInformationItem.createInstance("Model Version", model ? model.version : null),
+      ModelInformationItem.createInstance("Model Customization ID", model ? model.customizationUuid : null),
+      ModelInformationItem.createInstance("Instance ID", instance ? instance.instanceId : null),
+      ModelInformationItem.createInstance("In Maintenance", instance? instance.inMaint : null),
+    ];
+    modelInfoItems = modelInfoItems.concat(modelInfoSpecificItems);
+    const modelInfoItemsWithoutEmpty = _.filter(modelInfoItems, function(item){ return !item.values.every(_.isNil)});
+    return new ComponentInfoModel(type, modelInfoItemsWithoutEmpty, []);
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.html
new file mode 100644 (file)
index 0000000..f02ed62
--- /dev/null
@@ -0,0 +1,78 @@
+<div class="drawing-board-header">
+  <div class="left-header">
+    <span class="vid-logo-small"></span>
+    <span class="icon-back">
+      <svg-icon
+        (click)="closePage()"
+        [testId]="'backBtn'"
+        [size]="'large'"
+        [name]="'navigation-arrow-back'">
+              </svg-icon>
+    </span>
+
+    <div class="header-col middleDetails" style="padding-top: 5px;padding-left: 13px;line-height: 100%;" *ngIf="isServiceFailed">
+      <custom-popover class="failed-popover-wrap" [value]= "serviceStatusMessage" [placement]="'bottom'" [popoverType]="'error'">
+        <span [attr.data-tests-id]="'service-failed-msg'" class="failed-msg labelPosition" >Failed</span>
+      </custom-popover>
+    </div>
+    <div class="header-col middleDetails" style="padding-top: 0px;padding-left: 13px;line-height: 100%;padding-right: 50px;">
+      <span [attr.data-tests-id]="'serviceInstance'" class="service-instance-label labelPosition">Service instance:</span>
+      <span [attr.data-tests-id]="'serviceName'" [ngClass]="{'deleted' : isDeleted}" class="service-instance-name">{{serviceName}}</span>
+    </div>
+    <div class="header-col middleDetails notShowOnCreateMode"
+         style="padding-top: 0px;padding-left: 13px;line-height: 100%;">
+      <span [attr.data-tests-id]="'orchStatusLabel'" class="service-instance-label labelPosition">Orch Status:</span>
+      <span [attr.data-tests-id]="'orchStatusValue'" class="orch-status-value">{{serviceOrchStatus}}</span>
+    </div>
+    <div class="quantity-container header-col middleDetails"
+         style="padding-top: 0px;padding-left: 13px;line-height: 100%;"
+         tooltip="Number of services to instantiate including all their objects as defined below">
+      <span [attr.data-tests-id]="'quantityLabel'" class="quantity-instance-label labelPosition">Scale Times:</span>
+      <span [attr.data-tests-id]="'servicesQuantity'" class="scale-value"
+            style="font-family: OpenSans-Semibold;font-size: 13px;"> {{numServicesToDeploy}} </span>
+    </div>
+
+    <span [attr.data-tests-id]="'serviceStatus'" class="status" tooltip="{{status}}"></span>
+    <span [attr.data-tests-id]="'isViewOnly-status-test'" class="service-instance-label purple">{{getModeName()}}</span>
+  </div>
+
+
+  <div class="right-header">
+    <span class="menu-container notShowOnViewMode notShowOnRetryMode">
+      <span [attr.data-tests-id]="'openMenuBtn'" class="icon-browse" (click)="onContextMenu($event)"></span>
+      <context-menu>
+        <ng-template *ngIf="drawingBoardHeaderService?.showEditService(mode, serviceModelId)" contextMenuItem (execute)="editService()">
+          <div [attr.data-tests-id]="'context-menu-header-edit-item'">
+            <span class="icon-edit"></span>Edit</div>
+        </ng-template>
+        <ng-template *ngIf="mode === 'EDIT'" contextMenuItem
+                     (execute)="isDeleted=!isDeleted; drawingBoardHeaderService.deleteService(serviceModelId,isDeleted)">
+          <div [attr.data-tests-id]="'context-menu-header-delete-item'"><span class="icon-trash"></span>{{isDeleted ? 'Undo delete': 'Delete'}}</div>
+        </ng-template>
+        <ng-template *ngIf="mode !== 'CREATE'" contextMenuItem
+                     (execute)="drawingBoardHeaderService.showAuditInfo(serviceModelId)">
+          <div  [attr.data-tests-id]="'context-menu-header-audit-item'" style="float: left;margin-top: 8px;">
+                  <svg-icon
+                    [ngClass]="'eye-o'"
+                    class="eye-o"
+                    [size]="'small'"
+                    [name]="'eye-o'">
+                </svg-icon></div>
+                <div style="padding-left: 12px;">Show Audit Info</div>
+        </ng-template>
+      </context-menu>
+    </span>
+    <button [disabled]="drawingBoardHeaderService?.deployShouldBeDisabled(serviceModelId, mode)"
+            *ngIf="mode !== 'VIEW' && mode !== 'RETRY'; else viewEditButton"
+            [attr.data-tests-id]="'deployBtn'"
+            (click)="deployService()"
+            class="deploy-btn">{{drawingBoardHeaderService?.getModeButton(mode)}}</button>
+    <ng-template #viewEditButton>
+      <button [disabled]="!isPermitted()"
+        [attr.data-tests-id]="'editBtn'"
+        (click)="editViewEdit()"
+        class="deploy-btn">{{drawingBoardHeaderService?.getButtonText(mode)}}
+      </button>
+    </ng-template>
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.scss
new file mode 100644 (file)
index 0000000..1242f94
--- /dev/null
@@ -0,0 +1,176 @@
+.drawing-board-header {
+  height: 60px;
+  font-family: OpenSans-Regular;
+  display: flex;
+  justify-content: space-between;
+  font-size: 14px;
+  box-shadow: 2px 2px 6px #D2D2D2;
+  color: #191919;
+  z-index: 1;
+  position: relative;
+    [class^="icon-"] {
+      height: 60px;
+      width: 60px;
+      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 {
+        justify-content: center;
+        border-right: 1px solid #EAEAEA;
+      }
+      .vid-logo-small{
+        background: url('../../../../assets/img/vid-logo.jpg') no-repeat;
+        width: 60px;
+        height: 60px;
+      }
+      .status{
+        background: url('../../../../assets/img/indesign.svg') no-repeat  center;
+        width: 24px;
+        height: 24px;
+        margin-left: 20px;
+      }
+      .header-col {
+        border-right: 1px solid #d2d2d2;
+        padding-right: 15px;
+        margin-left: 15px;
+        span{
+          display: block;
+        }
+        &:after{
+          content: "";
+          background: #D2D2D2;
+          height: 35px;
+          width: 1px;
+        }
+      }
+      .service-instance-label {
+        font-family: OpenSans-Semibold;
+        font-size: 13px;
+        color: #5A5A5A;
+      }
+      .quantity-instance-label {
+        font-family: OpenSans-Regular;
+        font-size: 13px;
+        color: #5A5A5A;
+      }
+
+      .labelPosition {
+        margin-top: 4px;
+        margin-bottom: 6px;
+        font-size: 12px;
+      }
+      .service-instance-name {
+        font-family: OpenSans-Semibold;
+        color: #191919;
+        background-color: white;
+        font-size: 14px;
+        &.deleted{
+          text-decoration: line-through;
+        }
+      }
+      .orch-status-value {
+        font-family: OpenSans-Regular;
+        font-size: 14px;
+        color: #191919;
+      }
+      .scale-value {
+        font-family: OpenSans-Regular;
+        font-size: 14px;
+        color: #191919;
+      }
+      .status {
+        font-family: OpenSans-Semibold;
+        line-height: 14px;
+        font-size: 14px;
+        text-align: center;
+        width: 30px;
+        margin-left: 13px;
+        margin-right: 3px;
+      }
+
+      .purple {
+        color: #9063CD;
+      }
+
+      .middleDetails {
+        border-right: 1px solid #EAEAEA;
+        margin-left: 0;
+        height: 45px;
+      }
+    }
+    .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;
+        }
+      }
+      .scale-container {
+        .scale-label {
+          padding-left: 10px;
+          font-family: OpenSans-Semibold;
+          font-size: 12px;
+        }
+        .scale {
+          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;
+        justify-content: center;
+        flex-direction: column;
+        text-align: center;
+        cursor: pointer;
+      }
+      .icon-browse:before {
+        content: '\e924';
+        display: inline-block;
+        font-size: 24px;
+      }
+      .deploy-btn {
+        color: #FFFFFF ;
+        background: #009fdb;
+        width: 128px;
+        height: 100%;
+        border: none;
+        &[disabled] {
+          cursor: not-allowed;
+          opacity: .65;
+          color: #99d6ec;
+        }
+      }
+    }
+  }
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.component.ts
new file mode 100644 (file)
index 0000000..6e43915
--- /dev/null
@@ -0,0 +1,187 @@
+import {Component, ViewChild} from '@angular/core';
+import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu';
+import {DialogService} from 'ng2-bootstrap-modal';
+import {MsoService} from '../../../shared/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} from "../../../shared/components/messageBox/messageBox.data";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {IframeService} from "../../../shared/utils/iframe.service";
+import {
+  GenericFormPopupComponent,
+  PopupType
+} from "../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {ServicePopupService} from "../../../shared/components/genericFormPopup/genericFormServices/service/service.popup.service";
+import {SdcUiCommon} from "onap-ui-angular";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import {DrawingBoardHeaderService} from "./drawing-board-header.service";
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+import {DrawingBoardPermissions} from "../../guards/servicePlanningGuard/drawingBoardGuard";
+import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.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;
+  jobId: string;
+  parentElementClassName = 'content';
+  mode : DrawingBoardModes = DrawingBoardModes.CREATE;
+  serviceOrchStatus: string;
+  isDeleted: boolean = false;
+  store : NgRedux<AppState>;
+  drawingBoardPermissions : DrawingBoardPermissions;
+  drawingBoardHeaderService : DrawingBoardHeaderService;
+  isServiceFailed: boolean;
+  serviceStatusMessage: string;
+  constructor(private _contextMenuService: ContextMenuService, private dialogService: DialogService,
+              private _iframeService : IframeService,
+              private route: ActivatedRoute, private msoService: MsoService,
+              private _servicePopupService : ServicePopupService,
+              private _drawingBoardHeaderService : DrawingBoardHeaderService,
+              private _store: NgRedux<AppState>,
+              private _drawingBoardPermissions : DrawingBoardPermissions) {
+    this.store = _store;
+    this.drawingBoardPermissions = _drawingBoardPermissions;
+    this.drawingBoardHeaderService = _drawingBoardHeaderService;
+    this.mode = (!_.isNil(this.route.routeConfig.path) && this.route.routeConfig.path !== "") ?   this.route.routeConfig.path as DrawingBoardModes : DrawingBoardModes.CREATE;
+    this.route
+      .queryParams
+      .subscribe((params) => {
+        this.serviceModelId = params['serviceModelId'];
+        this.jobId = params['jobId'];
+        if (_.has(this.store.getState().service.serviceHierarchy, this.serviceModelId)) {
+          this.setValuesFromStore();
+          this.store.subscribe(() => {
+            this.setValuesFromStore();
+          });
+        }
+      });
+  }
+
+
+  @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent;
+
+  editViewEdit(): void {
+     window.parent.location.assign(this._drawingBoardHeaderService.generateOldViewEditPath());
+  }
+
+  isPermitted() : boolean {
+    return this.drawingBoardPermissions.isEditPermitted;
+}
+
+  getModeName():string {
+    switch (this.mode) {
+      case DrawingBoardModes.CREATE:
+        return 'IN DESIGN';
+      case DrawingBoardModes.VIEW:
+      case DrawingBoardModes.RETRY:
+        return 'VIEW ONLY';
+      case DrawingBoardModes.EDIT:
+      case DrawingBoardModes.RETRY_EDIT:
+        return 'IN EDITING';
+      default:
+        return 'IN DESIGN';
+    }
+
+  }
+  public onContextMenu($event: MouseEvent, item: any): void {
+    this._contextMenuService.show.next({
+      contextMenu: this.contextMenu,
+      event: $event,
+      item: item,
+    });
+    $event.preventDefault();
+    $event.stopPropagation();
+  }
+
+  private setValuesFromStore() {
+    if(!_.isNil(this.store.getState().service.serviceInstance) && !_.isNil(this.store.getState().service.serviceInstance[this.serviceModelId])){
+      const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
+      this.numServicesToDeploy = serviceInstance.bulkSize;
+      this.serviceName = serviceInstance.instanceName || '<Automatically Assigned>';
+      this.serviceOrchStatus =  serviceInstance.orchStatus || "";
+      this.isServiceFailed = serviceInstance.isFailed;
+      this.serviceStatusMessage = serviceInstance.statusMessage;
+    }
+  }
+
+  public editService(): void {
+    this._iframeService.addClassOpenModal(this.parentElementClassName);
+    this.dialogService.addDialog(GenericFormPopupComponent, {
+      type: PopupType.SERVICE,
+      uuidData: <any>{
+        type : PopupType.SERVICE,
+        isMacro : this.store.getState().service.serviceHierarchy[this.serviceModelId].service.instantiationType === 'Macro',
+        serviceId: this.serviceModelId,
+        popupService: this._servicePopupService
+      },
+      isUpdateMode: true
+    });
+  }
+
+  extractOwningEntityNameAccordingtoId(id:String): string {
+    let owningEntityName;
+    _.forEach(this.store.getState().service.categoryParameters.owningEntityList,(owningEntity: OwningEntity) => {
+      if (owningEntity.id === id) {
+        owningEntityName = owningEntity.name;
+
+      }});
+    return owningEntityName;
+  }
+
+  extractServiceFields(): any {
+    let instanceFields : ServiceInstance;
+    instanceFields = this.store.getState().service.serviceInstance[this.serviceModelId];
+    if (instanceFields.action === ServiceInstanceActions.Create) {
+      instanceFields.subscriberName = this.store.getState().service.subscribers.find(sub => sub.id === instanceFields.globalSubscriberId).name;
+      instanceFields.owningEntityName = this.extractOwningEntityNameAccordingtoId(instanceFields.owningEntityId);
+    }
+    return _.omit(instanceFields,'optionalGroupMembersMap');
+  }
+
+
+  public deployService(): void {
+      let instanceFields = this.extractServiceFields();
+      if (this.mode !== DrawingBoardModes.RETRY_EDIT) {
+        instanceFields.rollbackOnFailure = instanceFields.rollbackOnFailure === 'true';
+        this.msoService.submitMsoTask(instanceFields).subscribe((result) => {
+          window.parent.postMessage("navigateToInstantiationStatus", '*');
+        });
+      } else {
+        this.msoService.retryBulkMsoTask(this.jobId, 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?",
+      SdcUiCommon.ModalType.warning,
+      SdcUiCommon.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/service-planning/drawing-board-header/drawing-board-header.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.spec.ts
new file mode 100644 (file)
index 0000000..bcf6753
--- /dev/null
@@ -0,0 +1,184 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {DrawingBoardHeaderService} from "./drawing-board-header.service";
+import {ActivatedRoute} from '@angular/router';
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+import {AppState} from "../../../shared/store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {addServiceAction} from "../../../shared/storeUtil/utils/service/service.actions";
+import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import each from "jest-each";
+
+class MockAppStore<T>{
+  getState()  {
+    return {
+      service : {
+        serviceInstance : {
+          "serviceInstanceId" : {
+            action: 'None'
+          }
+        }
+      }
+    }
+  }
+}
+
+describe('Generate path to old View/Edit ', () => {
+  let injector;
+  let service: DrawingBoardHeaderService;
+  let httpMock: HttpTestingController;
+  let store :  NgRedux<AppState>;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, NgReduxTestingModule],
+      providers: [
+        DrawingBoardHeaderService,
+        DefaultDataGeneratorService,
+        MockNgRedux,
+        ErrorMsgService,
+        {
+          provide: ActivatedRoute,
+          useValue: {
+            snapshot : {
+              queryParams:{
+                'subscriberId' : 'subscriberId',
+                'subscriberName' : 'subscriberName',
+                'serviceType' : 'serviceType',
+                'serviceInstanceId' : 'serviceInstanceId'
+              }
+            }
+          },
+        }]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(DrawingBoardHeaderService);
+    httpMock = injector.get(HttpTestingController);
+    store = injector.get(NgRedux);
+
+  })().then(done).catch(done.fail));
+
+
+  test('should generate url to old view/edit ', () => {
+    const query: string = 'subscriberId=subscriberId&subscriberName=subscriberName&serviceType=serviceType&serviceInstanceId=serviceInstanceId';
+    const path =  '../../serviceModels.htm#/instantiate?' + query;
+    let result = service.generateOldViewEditPath();
+   expect(result).toEqual(path);
+  });
+
+  test('should call update action for Delete',()=>{
+
+    jest.spyOn(store, 'dispatch');
+    service.deleteService("serviceInstanceId", true);
+    expect(store.dispatch).toHaveBeenCalledWith(addServiceAction("serviceInstanceId", ServiceInstanceActions.Delete));
+  });
+
+  test('should call update action for undo delete',()=>{
+    jest.spyOn(store, 'dispatch');
+    service.deleteService("serviceInstanceId", false);
+    expect(store.dispatch).toHaveBeenCalledWith(addServiceAction("serviceInstanceId", ServiceInstanceActions.None));
+  });
+
+  test('deployShouldBeDisabled with validationCounter greater then 0',()=>{
+    jest.spyOn(store, 'getState').mockReturnValue({
+      service: {
+        serviceInstance : {
+          'serviceInstanceId' : {
+            validationCounter : 1
+          }
+        }
+      }
+    });
+    let result = service.deployShouldBeDisabled("serviceInstanceId");
+    expect(result).toBeTruthy();
+  });
+
+  test('deployShouldBeDisabled with validationCounter is 0 and not dirty',()=>{
+    jest.spyOn(store, 'getState').mockReturnValue({
+      service: {
+        serviceInstance : {
+          'serviceInstanceId' : {
+            validationCounter : 0,
+            isDirty : false
+          }
+        }
+      }
+    });
+    let result = service.deployShouldBeDisabled("serviceInstanceId");
+    expect(result).toBeFalsy();
+  });
+
+  test('deployShouldBeDisabled with validationCounter is 0 and dirty',()=>{
+    jest.spyOn(store, 'getState').mockReturnValue({
+      service: {
+        serviceInstance : {
+          'serviceInstanceId' : {
+            validationCounter : 0,
+            action : 'None',
+            isDirty : true
+          }
+        }
+      }
+    });
+    let result = service.deployShouldBeDisabled("serviceInstanceId");
+    expect(result).not.toBeTruthy();
+  });
+
+  test('deployShouldBeDisabled with validationCounter is 0 and not and action is None and dirty',()=>{
+    jest.spyOn(store, 'getState').mockReturnValue({
+      service: {
+        serviceInstance : {
+          'serviceInstanceId' : {
+            validationCounter : 0,
+            action : ServiceInstanceActions.None,
+            isDirty : true
+          }
+        }
+      }
+    });
+    let result = service.deployShouldBeDisabled("serviceInstanceId");
+    expect(result).not.toBeTruthy();
+  });
+
+
+  test('getModeButton',()=>{
+    let result : string = service.getModeButton("EDIT");
+    expect(result).toEqual('UPDATE');
+
+    result  = service.getModeButton("");
+    expect(result).toEqual('DEPLOY');
+
+    result  = service.getModeButton("RETRY_EDIT");
+    expect(result).toEqual('REDEPLOY');
+  });
+  test('getButtonText',()=>{
+    expect(service.getButtonText("VIEW")).toEqual('EDIT');
+    expect(service.getButtonText("RETRY")).toEqual('REDEPLOY');
+
+  });
+  const showEditServiceDataProvider = [
+    ['Create action CREATE mode', DrawingBoardModes.CREATE ,ServiceInstanceActions.Create, true],
+    ['Create action RETRY_EDIT mode',DrawingBoardModes.RETRY_EDIT,  ServiceInstanceActions.Create,  true],
+    ['Create action EDIT mode',DrawingBoardModes.EDIT, ServiceInstanceActions.Create,  true],
+    ['Create action RETRY mode',DrawingBoardModes.RETRY, ServiceInstanceActions.Create,  false],
+    ['None action EDIT mode',DrawingBoardModes.EDIT,  ServiceInstanceActions.None, false],
+    ['None action RETRY_EDIT mode', DrawingBoardModes.RETRY_EDIT, ServiceInstanceActions.None, false]];
+  each(showEditServiceDataProvider).test('showEditService service with %s', (description, mode, action, enabled) => {
+    jest.spyOn(store, 'getState').mockReturnValue({
+      service: {
+        serviceInstance : {
+          'serviceInstanceId' : {
+            action : action
+          }
+        }
+      }
+    });
+    expect(service.showEditService(mode, 'serviceInstanceId')).toBe(enabled);
+
+  });
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-header/drawing-board-header.service.ts
new file mode 100644 (file)
index 0000000..946c5ca
--- /dev/null
@@ -0,0 +1,86 @@
+import {Injectable} from "@angular/core";
+import {ActivatedRoute} from "@angular/router";
+import {addServiceAction} from "../../../shared/storeUtil/utils/service/service.actions";
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+import {AppState} from "../../../shared/store/reducers";
+import {DrawingBoardTreeComponent} from "../drawing-board-tree/drawing-board-tree.component";
+import {AuditInfoModalComponent} from "../../../shared/components/auditInfoModal/auditInfoModal.component";
+import {ServiceModel} from "../../../shared/models/serviceModel";
+import {NgRedux} from "@angular-redux/store";
+import * as _ from 'lodash';
+import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import {ServiceInstance} from "../../../shared/models/serviceInstance";
+
+@Injectable()
+export class DrawingBoardHeaderService{
+
+  constructor(private route: ActivatedRoute, private store: NgRedux<AppState>, private errorMsgService: ErrorMsgService){}
+  generateOldViewEditPath(): string{
+    let query: string =
+      `subscriberId=${this.route.snapshot.queryParams['subscriberId']}&` +
+      `subscriberName=${this.route.snapshot.queryParams['subscriberName']}&` +
+      `serviceType=${this.route.snapshot.queryParams['serviceType']}&` +
+      `serviceInstanceId=${this.route.snapshot.queryParams['serviceInstanceId']}`;
+    return '../../serviceModels.htm#/instantiate?' + query;
+  }
+
+  deleteService(serviceModelId: string, isDeleted: boolean ) {
+    if(isDeleted){
+      this.store.dispatch(addServiceAction(serviceModelId, ServiceInstanceActions.Delete));
+      DrawingBoardTreeComponent.triggerDeleteActionService.next(serviceModelId);
+    } else{
+      this.store.dispatch(addServiceAction(serviceModelId, ServiceInstanceActions.None));
+      DrawingBoardTreeComponent.triggerUndoDeleteActionService.next(serviceModelId);
+    }
+  }
+
+  showAuditInfo(serviceModelId) : void {
+    let instance: ServiceInstance = this.store.getState().service.serviceInstance[serviceModelId];
+    let model =  new ServiceModel(this.store.getState().service.serviceHierarchy[serviceModelId]);
+    AuditInfoModalComponent.openInstanceAuditInfoModal.next({instanceId : serviceModelId , type : 'SERVICE', model : model , instance : instance, trackById: instance.trackById});
+  }
+
+
+  /*************************************************
+    should return true if deploy should be disabled
+   *************************************************/
+  deployShouldBeDisabled(serviceInstanceId: string, mode : string) : boolean {
+    const serviceInstance = this.store.getState().service.serviceInstance[serviceInstanceId];
+    if(!_.isNil(serviceInstance)){
+      const validationCounter = serviceInstance.validationCounter;
+      if (!_.isNil(this.errorMsgService.errorMsgObject)&& mode !== DrawingBoardModes.RETRY_EDIT) return true;
+      if(validationCounter > 0) return true;
+      if(serviceInstance.action !== ServiceInstanceActions.None) return false;
+      if(mode === DrawingBoardModes.RETRY_EDIT) return false;
+      return !serviceInstance.isDirty;
+    }
+    return true;
+  }
+
+  getModeButton(mode : string) : string {
+    switch (mode) {
+      case DrawingBoardModes.EDIT:
+        return 'UPDATE';
+      case DrawingBoardModes.RETRY_EDIT:
+        return 'REDEPLOY';
+      default: return 'DEPLOY';
+    }
+  }
+  getButtonText(mode : DrawingBoardModes) : string {
+    switch (mode) {
+      case DrawingBoardModes.EDIT:
+      case DrawingBoardModes.VIEW:
+        return 'EDIT';
+      case DrawingBoardModes.RETRY_EDIT:
+      case DrawingBoardModes.RETRY:
+        return 'REDEPLOY';
+    }
+  }
+
+  showEditService(mode: DrawingBoardModes, serviceModelId: string): boolean{
+    const serviceInstance = this.store.getState().service.serviceInstance;
+    return mode === DrawingBoardModes.CREATE || ((mode === DrawingBoardModes.RETRY_EDIT || mode === DrawingBoardModes.EDIT)&&
+      !_.isNil(serviceInstance) && !_.isNil(serviceInstance[serviceModelId])&& serviceInstance[serviceModelId].action === ServiceInstanceActions.Create);
+  }
+}
@@ -8,7 +8,7 @@ export default
       "modelVersion": "10.0"
     },
     "owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
-    "owningEntityName": "PACKET CORE",
+    "owningEntityName": "JULIO ERICKSON",
     "projectName": "{some project name}",
     "globalSubscriberId": "{some subscriber id}",
     "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.model.ts
new file mode 100644 (file)
index 0000000..a8e9b43
--- /dev/null
@@ -0,0 +1,15 @@
+/******************************************
+ type - node type
+ isFirstLevel : node is first level
+ ******************************************/
+
+export class DragAndDropModel {
+  type : string;
+  isFirstLevel : boolean;
+
+  constructor(type : string, isFirstLevel : boolean){
+    this.type = type;
+    this.isFirstLevel = isFirstLevel;
+  }
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts
new file mode 100644 (file)
index 0000000..1221cef
--- /dev/null
@@ -0,0 +1,227 @@
+import {TestBed, getTestBed} from '@angular/core/testing';
+import {
+  HttpClientTestingModule,
+  HttpTestingController
+} from '@angular/common/http/testing';
+import {NgRedux} from "@angular-redux/store";
+import {DragAndDropService} from "./dragAndDrop.service";
+import {AppState} from "../../../../shared/store/reducers";
+
+class MockAppStore<T> {
+  dispatch(){
+
+  }
+  getState() {
+    return {
+      global: {
+        flags: {
+          "DRAG_AND_DROP_OPERATION" : true
+        }
+      },
+      service: {
+        serviceInstance: {
+          "serviceInstanceId": {
+            vnfs: {
+              "vnfStoreKey": {
+                isMissingData: true,
+                vfModules: {
+                  "vfModulesName": {
+                    "vfModulesName": {
+                      isMissingData: true
+                    }
+                  }
+                }
+              },
+
+              "vnfStoreKey1": {
+                isMissingData: false,
+                vfModules: {
+                  "vfModulesName": {
+                    "vfModulesName": {
+                      isMissingData: false
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+describe('Drag and drop service', () => {
+  let injector;
+  let service: DragAndDropService;
+  let httpMock: HttpTestingController;
+  let store: NgRedux<AppState>;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [
+        DragAndDropService,
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(DragAndDropService);
+    httpMock = injector.get(HttpTestingController);
+    store = injector.get(NgRedux);
+  })().then(done).catch(done.fail));
+
+
+  test('drag should move element position', () => {
+    let nodes = [{
+      "modelCustomizationId": "91415b44-753d-494c-926a-456a9172bbb9",
+      "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+      "modelUniqueId": "91415b44-753d-494c-926a-456a9172bbb9",
+      "missingData": false,
+      "id": "tjjongy92jn",
+      "action": "Create",
+      "inMaint": false,
+      "name": "yoav2_001",
+      "modelName": "VF_vMee 0",
+      "type": "VF",
+      "isEcompGeneratedNaming": true,
+      "networkStoreKey": "VF_vMee 0:0001",
+      "vnfStoreKey": "VF_vMee 0:0001",
+      "typeName": "VNF",
+      "menuActions": {"edit": {}, "showAuditInfo": {}, "duplicate": {}, "remove": {}, "delete": {}, "undoDelete": {}},
+      "isFailed": false,
+      "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, {
+        "key": "Orch Status:",
+        "testId": "orchStatus"
+      }],
+      "trackById": "di9khuolht",
+      "parentType": "",
+      "position": 0,
+      "children": [{
+        "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+        "modelId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+        "modelUniqueId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+        "missingData": false,
+        "id": 6654971919519,
+        "action": "Create",
+        "name": "VFModule1",
+        "modelName": "vf_vmee0..VfVmee..base_vmme..module-0",
+        "type": "VFmodule",
+        "isEcompGeneratedNaming": true,
+        "dynamicInputs": [],
+        "dynamicModelName": "vf_vmee0..VfVmee..base_vmme..module-0bykqx",
+        "typeName": "M",
+        "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}},
+        "isFailed": false,
+        "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, {
+          "key": "Orch Status:",
+          "testId": "orchStatus"
+        }],
+        "trackById": "5pfyfah820h",
+        "parentType": "VNF",
+        "position": 0,
+        "errors": {}
+      }, {
+        "modelCustomizationId": "6add59e0-7fe1-4bc4-af48-f8812422ae7c",
+        "modelId": "41708296-e443-4c71-953f-d9a010f059e1",
+        "modelUniqueId": "6add59e0-7fe1-4bc4-af48-f8812422ae7c",
+        "missingData": false,
+        "id": 987761655742,
+        "action": "Create",
+        "name": "VNFModule3",
+        "modelName": "vf_vmee0..VfVmee..vmme_gpb..module-2",
+        "type": "VFmodule",
+        "isEcompGeneratedNaming": true,
+        "dynamicInputs": [],
+        "dynamicModelName": "vf_vmee0..VfVmee..vmme_gpb..module-2fjrrc",
+        "typeName": "M",
+        "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}},
+        "isFailed": false,
+        "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, {
+          "key": "Orch Status:",
+          "testId": "orchStatus"
+        }],
+        "trackById": "i3dllio31bb",
+        "parentType": "VNF",
+        "position": 1,
+        "errors": {}
+      }, {
+        "modelCustomizationId": "55b1be94-671a-403e-a26c-667e9c47d091",
+        "modelId": "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+        "modelUniqueId": "55b1be94-671a-403e-a26c-667e9c47d091",
+        "missingData": false,
+        "id": 873798901625,
+        "action": "Create",
+        "name": "VFModule2",
+        "modelName": "vf_vmee0..VfVmee..vmme_vlc..module-1",
+        "type": "VFmodule",
+        "isEcompGeneratedNaming": true,
+        "dynamicInputs": [],
+        "dynamicModelName": "vf_vmee0..VfVmee..vmme_vlc..module-1djjni",
+        "typeName": "M",
+        "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}},
+        "isFailed": false,
+        "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, {
+          "key": "Orch Status:",
+          "testId": "orchStatus"
+        }],
+        "trackById": "w7bvw1nh47s",
+        "parentType": "VNF",
+        "position": 2,
+        "errors": {}
+      }],
+      "errors": {}
+    }, {
+      "modelCustomizationId": "91415b44-753d-494c-926a-456a9172bbb9",
+      "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+      "modelUniqueId": "91415b44-753d-494c-926a-456a9172bbb9",
+      "missingData": false,
+      "id": "dywch8hkomi",
+      "action": "Create",
+      "inMaint": false,
+      "name": "yoav2",
+      "modelName": "VF_vMee 0",
+      "type": "VF",
+      "isEcompGeneratedNaming": true,
+      "networkStoreKey": "VF_vMee 0",
+      "vnfStoreKey": "VF_vMee 0",
+      "typeName": "VNF",
+      "menuActions": {"edit": {}, "showAuditInfo": {}, "duplicate": {}, "remove": {}, "delete": {}, "undoDelete": {}},
+      "isFailed": false,
+      "statusProperties": [{"key": "Prov Status:", "testId": "provStatus"}, {
+        "key": "Orch Status:",
+        "testId": "orchStatus"
+      }],
+      "trackById": "fjczf1urdqo",
+      "parentType": "",
+      "position": 1,
+      "children": [],
+      "errors": {}
+    }];
+    let from = {
+      data: {
+        type: 'VF',
+        index: 1
+      }
+    };
+
+    let to = {
+      parent: {
+        data: {
+          type: 'VF',
+          index: 0
+        }
+      }
+    };
+    jest.spyOn(service, 'array_move');
+
+    service.drag(store, "serviceInstanceId", nodes, {from, to});
+
+
+    expect(service.array_move).toHaveBeenCalled();
+
+  });
+
+
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.ts
new file mode 100644 (file)
index 0000000..01763c6
--- /dev/null
@@ -0,0 +1,78 @@
+import {Injectable} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../shared/store/reducers";
+import {DragAndDropModel} from "./dragAndDrop.model";
+import {FeatureFlagsService, Features} from "../../../../shared/services/featureFlag/feature-flags.service";
+import * as _ from 'lodash';
+
+@Injectable()
+export class DragAndDropService {
+
+  constructor(private store: NgRedux<AppState>){}
+
+  isAllow(): boolean {
+    return FeatureFlagsService.getFlagState(Features.DRAG_AND_DROP_OPERATION, this.store);
+  }
+  /********************************************************************
+   * manage drawing-board drag and drop operation
+   * @param nodes - array with elements data.
+   * @param tree - tree instance
+   * @param node - element information
+   * @param from - element from information
+   * @param to - element to information
+   ************************************************************/
+
+  drag(store, instanceId : string , nodes, {from, to}) :void{
+    if (!store.getState().global.flags["DRAG_AND_DROP_OPERATION"]) return;
+
+    let firstLevelNames : DragAndDropModel[] = [
+        new DragAndDropModel('VF',true),
+        new DragAndDropModel('VL',true),
+        new DragAndDropModel('VFmodule',false)
+    ];
+
+    const fromObject = _.find(firstLevelNames, ['type', from.data.type]);
+    const toObject = _.find(firstLevelNames, ['type', to.parent.data.type]);
+
+    /***********************************************************************************************
+     if the type are the same and there in same level + same parent -> then change element position
+     ***********************************************************************************************/
+    if(fromObject.isFirstLevel === toObject.isFirstLevel){ // moving element in the same level and in the first level
+      if(fromObject.isFirstLevel){
+        this.array_move(nodes, from.index , to.parent.index, instanceId);
+      } else if(fromObject.isFirstLevel === toObject.isFirstLevel){
+        /* check if they have the same parent */
+        if(from.parent.data.trackById === to.parent.parent.data.trackById){
+          let vfModules = nodes.find((parents)=> {
+            return parents.trackById === to.parent.parent.data.trackById;
+          }).children;
+          this.array_move(vfModules, from.index , to.parent.index, instanceId, to.parent.parent.data.vnfStoreKey);
+        }
+      }
+    }
+  }
+
+
+   /********************************************************************
+   * move element inside array with elements position
+   * @param arr - array with elements data.
+   * @param originalPosition - element original position
+   * @param destPosition - element dest position
+   * @param destPinstanceIdosition - instance id
+   ******************************************************************/
+  array_move(arr, originalPosition, destPosition, instanceId : string, parentStoreKey?) {
+    if (destPosition >= arr.length) {
+      let k = destPosition - arr.length + 1;
+      while (k--) {
+        arr.push(undefined);
+      }
+    }
+    arr.splice(destPosition, 0, arr.splice(originalPosition, 1)[0]);
+    arr.forEach((item, index) => {
+      if(item.position !== index){
+        item.position = index;
+        item.updatePoistionFunction(this, item, instanceId, parentStoreKey);
+      }
+    });
+  };
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts
new file mode 100644 (file)
index 0000000..d071598
--- /dev/null
@@ -0,0 +1,207 @@
+import {AfterViewInit, Component, EventEmitter, OnInit, Output, ViewChild,} from '@angular/core';
+import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu';
+import {Constants} from '../../../shared/utils/constants';
+import {IDType, ITreeNode} from "angular-tree-component/dist/defs/api";
+import {TreeComponent, TreeModel, TreeNode} from "angular-tree-component";
+import {DialogService} from "ng2-bootstrap-modal";
+import {ActivatedRoute} from "@angular/router";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {IframeService} from "../../../shared/utils/iframe.service";
+import {DuplicateService} from '../duplicate/duplicate.service';
+import {DrawingBoardTreeService, TreeNodeContextMenuModel} from "./drawing-board-tree.service";
+import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {SdcUiServices} from "onap-ui-angular";
+import {HighlightPipe} from "../../../shared/pipes/highlight/highlight-filter.pipe";
+import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {ObjectToInstanceTreeService} from "../objectsToTree/objectToInstanceTree/objectToInstanceTree.service";
+import {SharedTreeService} from "../objectsToTree/shared.tree.service";
+import {Subject} from "rxjs/Subject";
+import {changeServiceIsDirty} from "../../../shared/storeUtil/utils/service/service.actions";
+import * as _ from 'lodash';
+import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service";
+import {DragAndDropService} from "./dragAndDrop/dragAndDrop.service";
+import {FeatureFlagsService, Features} from "../../../shared/services/featureFlag/feature-flags.service";
+import {PopoverPlacement} from "../../../shared/components/popover/popover.component";
+
+@Component({
+  selector: 'drawing-board-tree',
+  templateUrl: './drawing-board-tree.html',
+  styleUrls: ['./drawing-board-tree.scss'],
+  providers: [HighlightPipe]
+})
+
+export class DrawingBoardTreeComponent implements OnInit, AfterViewInit {
+  _store: NgRedux<AppState>;
+  duplicateService: DuplicateService;
+  drawingBoardTreeService: DrawingBoardTreeService;
+  errorMsgService: ErrorMsgService;
+  isFilterEnabled: boolean = false;
+  filterValue: string = '';
+  contextMenuOptions: TreeNodeContextMenuModel[];
+  static triggerDeleteActionService: Subject<string> = new Subject<string>();
+  static triggerUndoDeleteActionService: Subject<string> = new Subject<string>();
+  static triggerreCalculateIsDirty: Subject<string> = new Subject<string>();
+  @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent;
+
+  constructor(private _contextMenuService: ContextMenuService,
+              private _iframeService: IframeService,
+              private dialogService: DialogService,
+              private store: NgRedux<AppState>,
+              private route: ActivatedRoute,
+              private _duplicateService: DuplicateService,
+              private modalService: SdcUiServices.ModalService,
+              private _drawingBoardTreeService: DrawingBoardTreeService,
+              private _networkPopupService: NetworkPopupService,
+              private _vfModulePopuopService: VfModulePopuopService,
+              private _vnfPopupService: VnfPopupService,
+              private _vnfGroupPopupService: VnfGroupPopupService,
+              private _errorMsgService: ErrorMsgService,
+              private _highlightPipe: HighlightPipe,
+              private _objectToInstanceTreeService: ObjectToInstanceTreeService,
+              private _sharedTreeService: SharedTreeService,
+              private _dragAndDropService : DragAndDropService) {
+
+    this.errorMsgService = _errorMsgService;
+    this.duplicateService = _duplicateService;
+    this.drawingBoardTreeService = _drawingBoardTreeService;
+    this.contextMenuOptions = _drawingBoardTreeService.generateContextMenuOptions();
+
+    DrawingBoardTreeComponent.triggerDeleteActionService.subscribe((serviceModelId) => {
+      this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(this.nodes, serviceModelId, (node, serviceModelId)=>{
+        this.drawingBoardTreeService.deleteActionService(this.nodes, serviceModelId);
+        this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId));
+      });
+    });
+
+    DrawingBoardTreeComponent.triggerUndoDeleteActionService.subscribe((serviceModelId) => {
+      this.drawingBoardTreeService.undoDeleteActionService(this.nodes, serviceModelId);
+      this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId));
+    });
+
+    DrawingBoardTreeComponent.triggerreCalculateIsDirty.subscribe((serviceModelId) => {
+      this.store.dispatch(changeServiceIsDirty(this.nodes, serviceModelId));
+    });
+
+    this._store = store;
+    this.route
+      .queryParams
+      .subscribe(params => {
+        this.serviceModelId = params['serviceModelId'];
+      });
+  }
+
+  getNodeId(node: ITreeNode): string {
+    return (node.data.parentType !== "" ? (node.data.parentType + "_") : "") + node.data.typeName;
+  }
+
+  updateNodes(updateData: { nodes: any, filterValue: string }): void {
+    this.nodes = updateData.nodes;
+    this.filterValue = updateData.filterValue;
+  }
+
+  @Output()
+  highlightNode: EventEmitter<number> = new EventEmitter<number>();
+
+  @ViewChild('tree') tree: TreeComponent;
+  missingDataTooltip: string = Constants.Error.MISSING_VNF_DETAILS;
+  currentNode: ITreeNode = null;
+  flags: any;
+  nodes = [];
+  serviceModelId: string;
+  options = {
+    allowDrag: this._dragAndDropService.isAllow(),
+    actionMapping: {
+      mouse: {
+        drop: (tree:TreeModel, node:TreeNode, $event:any, {from, to}) => {
+          this._dragAndDropService.drag(this.store, this.serviceModelId, this.nodes, {from, to});
+        }
+      }
+    },
+    nodeHeight: 45,
+    dropSlotHeight: 1
+  };
+  parentElementClassName = 'content';
+
+  ngOnInit(): void {
+    this.store.subscribe(() => {
+      this.updateTree();
+    });
+    this.updateTree()
+  }
+
+  getNodeName(node: ITreeNode, filter: string) {
+      return this._highlightPipe.transform(node.data.name, filter ? filter : '');
+  }
+
+  updateTree() {
+    const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
+    this.nodes = this._objectToInstanceTreeService.convertServiceInstanceToTreeData(serviceInstance, this.store.getState().service.serviceHierarchy[this.serviceModelId]);
+    console.log('right nodes', this.nodes);
+
+  }
+
+
+  ngAfterViewInit(): void {
+    this.tree.treeModel.expandAll();
+  }
+
+  public onContextMenu($event: MouseEvent, node: ITreeNode): void {
+    this.flags = this.store.getState().global.flags;
+
+    this.currentNode = node;
+    node.focus();
+    node.setActiveAndVisible(false);
+    this.selectNode(node);
+    setTimeout(() => {
+      this._contextMenuService.show.next({
+        contextMenu: this.contextMenu,
+        event: <any>$event,
+        item: node,
+      });
+      $event.preventDefault();
+      $event.stopPropagation();
+    }, 250);
+
+  }
+
+
+  executeMenuAction(methodName: string): void {
+    if (!_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) {
+      this.currentNode.data.menuActions[methodName]['method'](this.currentNode, this.serviceModelId);
+      this.store.dispatch(changeServiceIsDirty(this.nodes, this.serviceModelId));
+    }
+  }
+
+  isEnabled(node: ITreeNode, serviceModelId: string, methodName: string): boolean {
+    if (!_.isNil(this.currentNode) && !_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) {
+      return this.currentNode.data.menuActions[methodName]['enable'](this.currentNode, this.serviceModelId);
+    }
+    return false;
+  }
+
+  isVisible(node: ITreeNode, methodName: string): boolean {
+    if (!_.isNil(this.currentNode) && !_.isNil(this.currentNode.data.menuActions) && !_.isNil(this.currentNode.data.menuActions[methodName])) {
+      return this.currentNode.data.menuActions[methodName]['visible'](this.currentNode, this.serviceModelId);
+    }
+    return false;
+  }
+
+  public selectNode(node: ITreeNode): void {
+    node.expand();
+    this._sharedTreeService.setSelectedVNF(node);
+    this.highlightNode.emit(node.data.modelUniqueId);
+    if (FeatureFlagsService.getFlagState(Features.FLAG_1906_COMPONENT_INFO, this.store)) {
+      node.data.onSelectedNode(node);
+    }
+  }
+
+  expandParentByNodeId(id: IDType): void {
+    this.tree.treeModel.getNodeById(id).parent.expand();
+  }
+
+}
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html
new file mode 100644 (file)
index 0000000..8af909f
--- /dev/null
@@ -0,0 +1,96 @@
+<error-msg></error-msg>
+<div class="drawing-board-tree" style="height: calc(100vh - 55px);">
+  <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.)"
+                                 title2="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>
+  <div class="tree-header" *ngIf="nodes?.length > 0">
+    <div class="title-tree">Instance:</div>
+    <search-component (updateNodes)="updateNodes($event)"
+                        [nodes]="nodes" [tree]="tree"
+                        [inputTestId]="'search-right-tree'"
+                        *ngIf="drawingBoardTreeService.isViewEditFlagTrue()"></search-component>
+  </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.id]="getNodeId(node)" [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName" (click)="selectNode(node)" >
+         <custom-popover class="failed-popover-wrap" *ngIf= "node?.data?.isFailed"  [value]= "node?.data?.statusMessage" [placement]="'left'" [popoverType]="'error'">
+          <div class="failed-msg" [attr.data-tests-id]="'failed-error-message'" *ngIf= "node?.data?.isFailed">Failed</div>
+         </custom-popover>
+          <div class="instance-type" style="position: relative;">
+            <div *ngIf="node?.data?.action == 'Create'" class="notShowOnViewMode notShowOnCreateMode newIcon"></div>
+            <div><span title="{{node.data.type}}" [attr.data-tests-id]="'node-type-indicator'">{{node?.data?.typeName}}</span></div>
+          </div>
+          <div class="model-info">
+          <span class="header-info">
+            <span class="property-name">
+              <span class="auto-name"
+                    [ngClass]="{'text_decoration' : drawingBoardTreeService.isTextDecoration(node)}"
+                    [innerHtml]="getNodeName(node, filterValue) | safe : 'html'"
+                    [attr.data-tests-id]="'node-name'"
+              ></span>
+            </span>
+          </span>
+            <tree-node-header-properties
+              *ngIf="(node?.data?.action !== 'Create' || node?.data?.parentType === 'VnfGroup') && !node?.data?.isFailed"
+              [properties]="node.data.statusProperties"></tree-node-header-properties>
+          </div>
+          <div class="scaling invalid" *ngIf="node?.data?.errors?.scalingError" [attr.data-tests-id]="'scaling-policy'">
+            <span>Limit</span><span>{{node?.data?.limitMembers}}</span>
+          </div>
+          <div class="model-actions notShowOnViewMode">
+          <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 *ngFor="let contextMenuOption of contextMenuOptions"
+                         contextMenuItem (execute)="executeMenuAction(contextMenuOption.methodName)"
+                         [visible]="isVisible(currentNode, contextMenuOption.methodName)"
+                         [enabled]="isEnabled(currentNode, serviceModelId, contextMenuOption.methodName)">
+              <div [attr.data-tests-id]="contextMenuOption.dataTestId">
+                <div style="float: left;margin-top: 3px;">
+                  <svg-icon
+                    [ngClass]="contextMenuOption.iconClass"
+                    class="icon-edit"
+                    [size]="'small'"
+                    [name]="contextMenuOption.iconClass">
+                </svg-icon></div>
+                <div style="padding-left: 25px;">{{contextMenuOption.label}}</div>
+              </div>
+            </ng-template>
+          </context-menu>
+          </span>
+            <span
+              *ngIf="drawingBoardTreeService.isVNFMissingData(node, serviceModelId)"
+              tooltip="{{ missingDataTooltip }}"
+              tooltipPlacement="left"
+              [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-alert-icon'"
+              class="icon-alert" >
+              <svg-icon
+                [mode]="'warning'"
+                [testId]="'icon-alert'"
+                [size]="'medium'"
+                [name]="'alert-triangle-o'">
+              </svg-icon>
+            </span>
+
+            <!--<span *ngIf="drawingBoardTreeService.isVNFMissingData(node, serviceModelId)" class="icon-alert"-->
+                  <!--tooltip="{{ missingDataTooltip }}" tooltipPlacement="left"-->
+                  <!--[attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-alert-icon'"></span>-->
+            <span *ngIf="drawingBoardTreeService.isVFModuleMissingData(node, serviceModelId)" 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>
+
+
+
       span.toggle-children {
         @include highlight(white, #009FDB);
         border-right: none;
+        .isFailed {
+          left: 0px !important;
+        }
       }
     }
+
   }
 }
 
+#VNF > node-content-wrapper {
+  border: 1px dashed #D2D2D2 !important;
+}
+
 @mixin highlight-tree-node-content {
   tree-node-content {
     > div {
   }
 }
 
+#RETRY_EDIT drawing-board-tree tree-node-collection > div,
+#RETRY drawing-board-tree tree-node-collection > div {
+   margin-top: 0px;
+   width: calc(100% - 50px);
+   margin-left: auto;
+ }
+
 drawing-board-tree {
+  flex: 1;
+  color: #5A5A5A;
+  line-height: 14px;
+  flex-direction:column;
+
+  &.col-md-6,&.col-md-5{
+    padding: 0;
+  }
+  .tree-header {
+    display: flex;
+    justify-content: space-between;
 
+    .title-tree {
+      font-family: OpenSans-SemiBold;
+      font-size: 16px;
+      color: #191919;
+      text-align: left;
+      text-transform: uppercase;
+      padding-bottom: 48px;
+    }
+    .search-container {
+      width: 275px;
+    }
+  }
+  .highlight {
+    background-color: #9DD9EF;
+  }
   .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%;
+    padding: 30px 45px;
+  }
+
+  .tree-node-level-1 {
+    margin-bottom: 10px;
   }
   tree-viewport {
-    padding: 50px 3.5% 1% 6%;
     tree-node {
       tree-node-drop-slot {
         .node-drop-slot {
@@ -57,14 +97,17 @@ drawing-board-tree {
           .node-wrapper {
             @include highlight-toggle-children;
             .node-content-wrapper-focused,
-            .node-content-wrapper-active
-            {
+            .node-content-wrapper-active {
+              @include highlight-toggle-children;
               @include highlight(#E6F6FB, #009FDB);
-              .property-name {
-                color: #009FDB;
+              .property-name,.instance-type {
+                color: #009FDB !important;
+                position: relative;
               }
-              .auto-name {
-                font-family: OpenSans-Regular !important;
+              .status-properties {
+                .status-property-value,.status-property-name {
+                  color: #009FDB;
+                }
               }
               .icon-browse:before {
                 color: #5A5A5A;
@@ -81,30 +124,29 @@ drawing-board-tree {
       }
 
       .tree-node-active .tree-children {
-        border: 1px solid #009FDB;
-        padding: 20px;
+        //border: 1px solid #009FDB;
+        padding-left: 45px;
       }
 
-
-
       .tree-node.tree-node-active.tree-node-expanded {
-        border: 1px solid #009FDB;
       }
 
-      .tree-node-leaf .node-wrapper{
-        margin-left: -45px;
+      .tree-children .tree-node-leaf .node-wrapper{
+        margin-left: -5px;
       }
 
+      .tree-node.tree-node-expanded > tree-node-wrapper{
+        box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);
+        position: relative;
+        z-index: 1;
+        display: block;
+      }
       tree-node-wrapper {
         .node-wrapper {
           height: 45px;
           &:hover {
-            @include highlight-toggle-children;
-            .node-content-wrapper {
-              @include highlight(#E6F6FB, #009FDB);
-              .property-name {
-                color: #009FDB;
-              }
+            .node-content-wrapper:not(.node-content-wrapper-focused) {
+              background: #F2F2F2;
               .icon-browse:before {
                 color: #5A5A5A;
               }
@@ -114,6 +156,9 @@ drawing-board-tree {
           tree-node-expander {
             font-family: 'icomoon' !important;
             height: 100%;
+            .failed-msg {
+
+            }
             .toggle-children-wrapper {
               padding: 0;
               display: block;
@@ -151,6 +196,7 @@ drawing-board-tree {
               width:45px;
             }
           }
+
           .node-content-wrapper {
             padding: 0;
             background: none;
@@ -159,33 +205,93 @@ drawing-board-tree {
             border: 1px solid #D2D2D2;
             height: 100%;
             flex: 1;
+            .resourceGroup {
+              border: 1px dashed #D2D2D2 !important;
+            }
             tree-node-content {
               > div {
                 height: 100%;
                 display: flex;
                 align-items: center;
-                justify-content: space-between;
-                .model-info {
+
+                .instance-type {
+                  width: 40px;
+                  height: 100%;
+                  padding-top: 16px;
+                  text-transform: uppercase;
+                  text-align: center;
+                  border-right: 1px solid #D2D2D2;
+                  word-break: break-all;
+                  color: #959595;
+                  font-size: 13px;
+                  font-family: OpenSans-SemiBold;
+                  .newIcon {
+                    background: #45B16D;
+                    position: absolute;
+                    top: 5%;
+                    width: 90%;
+                    left: 5%;
+                    right: 5%;
+                    border-radius: 2px;
+                    height: 5px;
+                  }
+                  span {
+                    width: 40px;
+                    display: block;
+                  }
+                } > span {
                   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;
+                  display: block;
+
+                  span:nth-child(2) {
+                    display: block;
+                  }
+                }
+                .model-info {
+                  padding-left: 16px;
+                  width: 100%;
+                  .property-name {
+                    font-family: OpenSans-SemiBold;
+                    font-size: 13px;
+                    color: #191919;
+                    //text-transform: capitalize;  problematic with search
+                    .auto-name{
+                      display: inline-flex;//required for search more then one sub highlight,
+                      font-size: 13px;
+                    }
+                    .text_decoration{
+                      text-decoration: line-through;
+                    }
+
+                    .text_decoration:after {
+                      height: 10px;
                     }
                   }
+                  tree-node-header-properties{
+                    display: block;
+                  }
+                }
+                .scaling {
+                  background: #4ca90c;
+                  padding: 5px;
+                  border-radius: 3px;
+                  font-family: OpenSans-SemiBold;
+                  font-size: 12px;
+                  color: #FFF9F9;
+                  &.invalid{
+                    background: #cf2a2a;
+                  }
+                  span:first-child{
+                    margin-right: 3px;
+                  }
                 }
                 .model-actions {
                   display: flex;
                   align-items: center;
-                  padding-right: 12px;
                   .icon-browse {
                     padding: 0;
                     width: 30px;
+                    height: 24px;
                     &:before {
                       content: "\e924";
                       font-size: 24px;
@@ -201,31 +307,17 @@ drawing-board-tree {
                   }
 
                   .icon-alert {
-                    padding-left: 10px;
-                    &:before {
-                      content: "\e904";
-                      font-size: 16px;
-                      color: #ffb81c;
-                    }
+                    padding-right: 10px;
                   }
                 }
               }
             }
-            .property-name {
-              font-family: OpenSans-Semibold;
-              font-size: 12px;
-              line-height: 12px;
-              color: #191919;
-              text-transform: capitalize;
-            }
           }
-
-
         }
       }
       tree-node-children {
         .tree-children {
-          padding: 20px;
+          padding-left: 45px;
           .model-info span:first-child {
             flex: 1.1 !important;
           }
@@ -234,6 +326,44 @@ drawing-board-tree {
     }
   }
 }
+
+
+.tree-node-level-1.tree-node.tree-node-expanded {
+  .failed-popover-wrap {
+    left: -50px !important;
+    position: absolute;
+  }
+}
+.tree-node-level-1 {
+  .failed-popover-wrap {
+    left: 45px !important;
+    position: absolute;
+  }
+}
+
+.tree-node-level-2.tree-node.tree-node-leaf {
+  .failed-popover-wrap {
+    left: 135px !important;
+    position: absolute;
+  }
+}
+
+.tree-node-level-1.tree-node.tree-node-collapsed {
+  .failed-popover-wrap{
+    left: 0px !important;
+    position: absolute;
+  }
+}
+
+.failed-msg{
+  background: #cf2a2a;
+  padding: 5px;
+  border-radius: 3px;
+  font-family: OpenSans-SemiBold;
+  font-size: 12px;
+  color: #FFF9F9;
+}
+
 .cdk-overlay-pane.ngx-contextmenu {
   ul.dropdown-menu {
     width: 200px;
@@ -272,3 +402,4 @@ drawing-board-tree {
   }
 }
 
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts
new file mode 100644 (file)
index 0000000..1b913cf
--- /dev/null
@@ -0,0 +1,147 @@
+import {TestBed, getTestBed} from '@angular/core/testing';
+import {
+  HttpClientTestingModule,
+  HttpTestingController
+} from '@angular/common/http/testing';
+import {NgRedux} from "@angular-redux/store";
+import {DrawingBoardTreeService, TreeNodeContextMenuModel} from "./drawing-board-tree.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+
+ class MockAppStore<T>{
+  getState()  {
+    return {
+     service : {
+       serviceInstance : {
+         "serviceInstanceId" : {
+           vnfs : {
+             "vnfStoreKey" : {
+               isMissingData : true,
+               vfModules : {
+                 "vfModulesName" : {
+                   "vfModulesName" : {
+                     isMissingData : true
+                   }
+                 }
+               }
+             },
+
+             "vnfStoreKey1" : {
+               isMissingData : false,
+               vfModules : {
+                 "vfModulesName" : {
+                   "vfModulesName" : {
+                     isMissingData : false
+                   }
+                 }
+               }
+             }
+           }
+         }
+       }
+     }
+   }
+  }
+}
+
+describe('Drawing board tree Service', () => {
+  let injector;
+  let service: DrawingBoardTreeService;
+  let httpMock: HttpTestingController;
+
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [
+        DrawingBoardTreeService,
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(DrawingBoardTreeService);
+    httpMock = injector.get(HttpTestingController);
+
+  })().then(done).catch(done.fail));
+
+
+
+
+  test('generateContextMenuOptions should return list of optional context menu', () => {
+    const options : TreeNodeContextMenuModel[] = service.generateContextMenuOptions();
+    const expected : TreeNodeContextMenuModel[] = [
+      new TreeNodeContextMenuModel('edit', 'context-menu-edit', 'Edit', 'edit-file-o'),
+      new TreeNodeContextMenuModel('duplicate', 'context-menu-duplicate', 'Duplicate', 'copy-o'),
+      new TreeNodeContextMenuModel('showAuditInfo', 'context-menu-showAuditInfo', 'Show audit info', 'eye-o'),
+      new TreeNodeContextMenuModel('addGroupMember', 'context-menu-addGroupMember', 'Add group members', 'plus'),
+      new TreeNodeContextMenuModel('delete', 'context-menu-delete', 'Delete', 'trash-o'),
+      new TreeNodeContextMenuModel('remove', 'context-menu-remove', 'Remove', 'trash-o'),
+      new TreeNodeContextMenuModel('undoDelete', 'context-menu-undoDelete', 'Undo Delete', 'undo-delete')
+    ];
+    expect(options.length).toEqual(7);
+    expect(options).toEqual(expected);
+  });
+
+  test('isVNFMissingData should return true if vnf isMissingData = true', () => {
+    let node : ITreeNode  = <any>{
+      data : {
+        type : 'VF',
+        vnfStoreKey : "vnfStoreKey"
+      }
+    };
+    let result : boolean = service.isVNFMissingData(node, "serviceInstanceId");
+    expect(result).toBeTruthy();
+  });
+
+
+  test('isVNFMissingData should return false if vnf has isMissingData = false', () => {
+    let node : ITreeNode  = <any>{
+      data : {
+        type : 'VFModule',
+        modelName : "vfModulesName",
+        dynamicModelName : "vfModulesName",
+        parent : {
+          vnfStoreKey : "vnfStoreKey1",
+          type : 'VF'
+        }
+      }
+    };
+    let result : boolean = service.isVNFMissingData(node, "serviceInstanceId");
+    expect(result).toBeFalsy();
+  });
+
+
+  test('isVFModuleMissingData should return true if vnfModule has isMissingData = true', () => {
+    let node : ITreeNode  = <any>{
+      data : {
+        type : 'VFModule',
+        modelName : "vfModulesName",
+        dynamicModelName : "vfModulesName",
+        parent : {
+          vnfStoreKey : "vnfStoreKey",
+          type : 'VF'
+        }
+      }
+    };
+    let result : boolean = service.isVFModuleMissingData(node, "serviceInstanceId");
+    expect(result).toBeFalsy();
+  });
+
+
+  test('isVFModuleMissingData should return false if vnfModule has isMissingData = false', () => {
+    let node : ITreeNode  = <any>{
+      data : {
+        type : 'VFModule',
+        modelName : "vfModulesName",
+        dynamicModelName : "vfModulesName",
+        parent : {
+          vnfStoreKey : "vnfStoreKey1",
+          type : 'VF'
+        }
+      }
+    };
+    let result : boolean = service.isVFModuleMissingData(node, "serviceInstanceId");
+    expect(result).toBeFalsy();
+  });
+
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts
new file mode 100644 (file)
index 0000000..17f761c
--- /dev/null
@@ -0,0 +1,129 @@
+import {Injectable} from "@angular/core";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import * as _ from 'lodash';
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {FeatureFlagsService, Features} from "../../../shared/services/featureFlag/feature-flags.service";
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+
+@Injectable()
+export class  DrawingBoardTreeService {
+  constructor(private store: NgRedux<AppState>){}
+  isVFModuleMissingData(node: ITreeNode, serviceModelId : string): boolean {
+    if(node.data.type === 'VFmodule' &&!_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs) &&  !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey])){
+      if(!_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules)
+        && !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName])
+        && !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName][node.data.dynamicModelName])){
+
+        return this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName][node.data.dynamicModelName].isMissingData;
+      }
+    }
+    return false;
+  }
+
+  isVNFMissingData(node : ITreeNode, serviceModelId : string) : boolean {
+    if(node.data.type == 'VF'  && !_.isNil(this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey])){
+      return  this.store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey].isMissingData;
+    }
+  }
+
+  isViewEditFlagTrue():boolean{
+    return FeatureFlagsService.getFlagState(Features.FLAG_1902_NEW_VIEW_EDIT, this.store);
+  }
+
+  /**********************************************
+   return all drawing board context menu options
+   ***********************************************/
+  generateContextMenuOptions() : TreeNodeContextMenuModel[]{
+    return [
+      new TreeNodeContextMenuModel('edit', 'context-menu-edit', 'Edit', 'edit-file-o'),
+      new TreeNodeContextMenuModel('duplicate', 'context-menu-duplicate', 'Duplicate', 'copy-o'),
+      new TreeNodeContextMenuModel('showAuditInfo', 'context-menu-showAuditInfo', 'Show audit info', 'eye-o'),
+      new TreeNodeContextMenuModel('addGroupMember', 'context-menu-addGroupMember', 'Add group members', 'plus'),
+      new TreeNodeContextMenuModel('delete', 'context-menu-delete', 'Delete', 'trash-o'),
+      new TreeNodeContextMenuModel('remove', 'context-menu-remove', 'Remove', 'trash-o'),
+      new TreeNodeContextMenuModel('undoDelete', 'context-menu-undoDelete', 'Undo Delete', 'undo-delete')
+    ];
+  }
+
+
+  /*******************************************************************
+    delete or remove all service child's on delete existing service
+   *******************************************************************/
+  deleteActionService(nodes : ITreeNode[], serviceModelId : string){
+    if(!_.isNil(nodes)){
+      for(let node of nodes){
+        node.data = node;
+        if(!_.isNil(node.children)){
+          node.children.map((child)=>{
+            child.data = child;
+            child.parent = node;
+          });
+        }
+
+        let menuActionsName : string = node.data.action === ServiceInstanceActions.Create ? 'remove' : 'delete';
+        if(!_.isNil(node.data.menuActions) && !_.isNil(node.data.menuActions[menuActionsName])){
+          node.data.menuActions[menuActionsName]['method'](node, serviceModelId)
+        }
+
+      }
+    }
+  }
+  /*******************************************************************
+   undo delete all service child's on undo delete existing service
+   *******************************************************************/
+  undoDeleteActionService(nodes : ITreeNode[], serviceModelId : string){
+    if(!_.isNil(nodes)){
+      for(let node of nodes){
+        node.data = node;
+        if(!_.isNil(node.children)){
+          node.children.map((child)=>{
+            child.data = child;
+            child.parent = node;
+          });
+        }
+
+        if(!_.isNil(node.data.menuActions) && !_.isNil(node.data.menuActions['undoDelete'])){
+          node.data.menuActions['undoDelete']['method'](node, serviceModelId)
+        }
+      }
+    }
+  }
+
+  /***********************************************************
+   return true if should add line hover the instance name
+   ***********************************************************/
+  isTextDecoration(node) : boolean{
+    return !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action.split('_').pop() === 'Delete';
+  }
+
+
+  /******************************************
+   should create object of instances action
+   ******************************************/
+  generateServiceActionObject(nodes){
+    let obj = {};
+    let index = 0;
+    for(let node of nodes){
+      obj[index] = {};
+      index++;
+    }
+  }
+}
+
+export class TreeNodeContextMenuModel {
+  methodName: string;
+  dataTestId: string;
+  label: string;
+  iconClass: string;
+
+  constructor(methodName: string,
+              dataTestId: string,
+              label: string,
+              iconClass: string) {
+    this.methodName = methodName;
+    this.dataTestId = dataTestId;
+    this.label = label;
+    this.iconClass = iconClass;
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/instance.tree.generator.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/instance.tree.generator.ts
new file mode 100644 (file)
index 0000000..188feaa
--- /dev/null
@@ -0,0 +1,8 @@
+import {Injectable} from "@angular/core";
+
+@Injectable()
+export class InstanceTreeGenerator {
+  convertServiceInstanceToTreeData(serviceInstance, serviceModelId : string) {
+
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.html
new file mode 100644 (file)
index 0000000..dae6762
--- /dev/null
@@ -0,0 +1,5 @@
+<div class="status-properties" *ngFor="let prop of properties">
+  <span class="status-property-name" [ngClass]="{'mark': prop.key=='In-maintenance'}">{{ prop.key }}</span>
+  <span class="status-property-value" [attr.data-tests-id]="'status-property-'+prop?.testId" >{{ prop.value }}</span>
+  <span class="separator">|</span>
+</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.scss
new file mode 100644 (file)
index 0000000..305de8c
--- /dev/null
@@ -0,0 +1,24 @@
+.status-properties{
+  display: inline-block;
+  font-family: OpenSans-Regular;
+  font-size: 12px;
+  padding-top: 3px;
+  .status-property-name{
+    color: #5A5A5A;
+    &.mark{
+      background-color: #959595;
+      color: #ffffff;
+    }
+  }
+  .status-property-value{
+    color: #191919;
+  }
+  .separator{
+    padding: 0 8px;
+  }
+  &:last-child .separator{
+    display: none;
+  }
+
+}
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.spec.ts
new file mode 100644 (file)
index 0000000..047f2e8
--- /dev/null
@@ -0,0 +1,25 @@
+import {ComponentFixture, TestBed } from '@angular/core/testing';
+import { TreeNodeHeaderPropertiesComponent } from './tree-node-header-properties.component';
+
+describe('TreeNodeHeaderPropertiesComponent', () => {
+  let component: TreeNodeHeaderPropertiesComponent;
+  let fixture: ComponentFixture<TreeNodeHeaderPropertiesComponent>;
+
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      declarations: [ TreeNodeHeaderPropertiesComponent ]
+    });
+    await TestBed.compileComponents();
+
+    fixture = TestBed.createComponent(TreeNodeHeaderPropertiesComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+
+  })().then(done).catch(done.fail));
+
+
+  test('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/tree-node-header-properties/tree-node-header-properties.component.ts
new file mode 100644 (file)
index 0000000..535d7ea
--- /dev/null
@@ -0,0 +1,10 @@
+import {Component, Input} from '@angular/core';
+
+@Component({
+  selector: 'tree-node-header-properties',
+  templateUrl: './tree-node-header-properties.component.html',
+  styleUrls: ['./tree-node-header-properties.component.scss']
+})
+export class TreeNodeHeaderPropertiesComponent {
+  @Input() properties : object[] = [];
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board.modes.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board.modes.ts
new file mode 100644 (file)
index 0000000..452666f
--- /dev/null
@@ -0,0 +1,8 @@
+export enum DrawingBoardModes {
+  RETRY = 'RETRY',
+  RETRY_EDIT = 'RETRY_EDIT',
+  VIEW = 'VIEW',
+  EDIT = 'EDIT',
+  OLD_VIEW_EDIT = 'OLD_VIEW_EDIT',
+  CREATE = 'CREATE'
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.html
new file mode 100644 (file)
index 0000000..c5f43b9
--- /dev/null
@@ -0,0 +1,19 @@
+<div>
+  <div>
+    <span style="font-weight: bold;">
+        Please select the number of additional instances you want to add of this node.
+    </span>
+  </div>
+  <div>
+    <span style="font-weight: bold;">
+        Important: VID will duplicate this node including its children.
+    </span>
+  </div>
+
+  <div class="duplicate-number">
+    <select class="quantity-select" [(ngModel)]="duplicateNumber" name="duplicate" [attr.data-tests-id]="'duplicate-amount-vfmodules'" id="duplicate-select" (change)="onDuplicateNumberChange()">
+      <option *ngFor="let item of duplicateOptions" [value]="item">{{item}}</option>
+    </select>
+  </div>
+  <!--TODO max -->
+</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.scss
new file mode 100644 (file)
index 0000000..f5b566d
--- /dev/null
@@ -0,0 +1,9 @@
+.quantity-select {
+  width: 100%;
+  font-family: inherit;
+  font-size: inherit;
+  border: 1px solid #009FDB;
+  margin-top: 10px;
+  padding-left: 7px;
+  height: 30px;
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate-vnf.component.ts
new file mode 100644 (file)
index 0000000..e1c5d72
--- /dev/null
@@ -0,0 +1,25 @@
+import { Component } from '@angular/core';
+import * as _ from 'lodash';
+import {DuplicateService} from "./duplicate.service";
+
+@Component({
+  selector: 'duplicate-vnf',
+  templateUrl : './duplicate-vnf.component.html',
+  styleUrls : ['./duplicate-vnf.component.scss']
+})
+export class DuplicateVnfComponent {
+  duplicateNumber : number = 1;
+  duplicateOptions : number[] = [];
+  duplicateService:DuplicateService;
+  constructor( private _duplicateService: DuplicateService ){
+    this.duplicateService = _duplicateService;
+    this.duplicateOptions =  _.range(1, this._duplicateService.maxNumberOfDuplicate + 1);
+    this.onDuplicateNumberChange();
+  }
+
+  onDuplicateNumberChange() {
+    this.duplicateService.setNumberOfDuplicates(+this.duplicateNumber);
+  }
+
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.spec.ts
new file mode 100644 (file)
index 0000000..81251cb
--- /dev/null
@@ -0,0 +1,449 @@
+import { DuplicateService } from './duplicate.service';
+import { LogService } from '../../../shared/utils/log/log.service';
+import { NgRedux } from '@angular-redux/store';
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import { SdcUiServices} from "onap-ui-angular";
+import {IModalConfig} from "onap-ui-angular/dist/components/common";
+import {AppState} from "../../../shared/store/reducers";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockAppStore<T> {
+  getState(){
+    return {
+      getState() {
+        return {
+          service : {
+            serviceHierarchy: {
+              "serviceId" : {
+                vnfs : {
+                  "vnfModelName" : {
+                    properties : {
+                      max_instances : 2
+                    }
+                  },
+                  "vnfModelName2" : {
+                    properties : {
+                      max_instances  : 2
+                    }
+                  },
+                  "vnfModelName3" : {
+                    properties : {
+                    }
+                  }
+                }
+              }
+            },
+            serviceInstance : {
+              "serviceId" : {
+                existingVNFCounterMap : {
+                  "vnfModelId" : 1,
+                  "vnfModelId2" : 2,
+                  "vnfModelId3" : 0
+                }
+              }
+
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+class MockModalService<T> {}
+
+describe('Drawing board tree service', () => {
+  let injector;
+  let service: DuplicateService;
+  let store : NgRedux<AppState>;
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      providers : [
+        DuplicateService,
+        LogService,
+        {provide: NgRedux, useClass: MockAppStore},
+        {provide: SdcUiServices.ModalService, useClass: MockModalService}
+      ]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(DuplicateService);
+    store = injector.get(NgRedux);
+
+  })().then(done).catch(done.fail));
+
+
+  test('setNumberOfDuplicates should set number of duplicates', ()=>{
+    service.setNumberOfDuplicates(10);
+    expect(service.numberOfDuplicates).toEqual(10);
+  });
+
+  test('isEnabled should return false if type is VNF and has missing data', ()=>{
+    let node  = {
+      data : {
+        type : 'VF',
+        menuActions : {
+          duplicate : () => {
+
+          }
+        }
+      }
+    };
+    spyOn(node.data.menuActions, 'duplicate').and.returnValue(true);
+    spyOn(service, 'hasMissingData').and.returnValue(true);
+    let result : boolean = service.isEnabled(<any>node, null, null);
+    expect(result).toBeFalsy();
+  });
+
+  test('openDuplicateModal', ()=>{
+    spyOn(service, 'getRemainsInstance').and.returnValue(1);
+    let result : IModalConfig = service.openDuplicateModal(
+      'currentServiceId',
+      'currentServiceId',
+      'currentId',
+      'storeKey',
+      2,
+      null,null);
+    expect(result.title).toEqual('Duplicate Node');
+  });
+
+  test('openDuplicateModal should call getRemainsInstance with correct parameters', ()=>{
+    spyOn(service, 'getRemainsInstance');
+    service.openDuplicateModal(
+      'currentServiceId',
+      'currentServiceId',
+      'currentId',
+      'storeKey',
+      2,
+      null,null);
+    expect(service.getRemainsInstance).toHaveBeenCalledWith('currentServiceId', 'currentId', 'currentServiceId', null, null);
+  });
+
+  test('canDuplicate VNF should return true', () => {
+    sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}}));
+    let node : ITreeNode = <any> {data : {type : 'VF'}};
+
+    let result = service.canDuplicate(node);
+    expect(result).toBeTruthy();
+  });
+
+  test('canDuplicate Network should return true', () => {
+    sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}}));
+    let node : ITreeNode = <any> {data : {type : 'VL'}};
+
+    let result = service.canDuplicate(node);
+    expect(result).toBeTruthy();
+  });
+
+  test('canDuplicate VFModule should return false', () => {
+    sessionStorage.setItem('reduxState' , JSON.stringify({global : { flags : {FLAG_DUPLICATE_VNF : true}}}));
+    let node : ITreeNode = <any> {data : {type : 'VFModule'}};
+
+    let result = service.canDuplicate(node);
+    expect(result).toBeFalsy();
+  });
+
+  test('Drawing board tree service should be defined', () => {
+    expect(service).toBeDefined();
+  });
+
+  test('DrawingBoardDuplicateService should be defined', () => {
+    expect(service).toBeDefined();
+  });
+
+  test('Duplicate multi vnfs should save multi vnfs in redux', () => {
+    service.existingNames = {
+      "2017488_adiodvpe": "",
+      "rrr": "",
+      "ttt": ""
+    };
+    let newVnfs = service.cloneVnf(<any>{
+      "vfModules": {
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi": {
+            "instanceName": "rrr",
+            "volumeGroupName": "ttt"
+          }
+        }
+      },
+      "originalName": null,
+      "trackById": "pfs1f0len3",
+      "instanceName": "2017488_ADIODvPE"
+    }, "2017-488_ADIOD-vPE 0");
+
+    expect(newVnfs.instanceName).toBe("2017488_ADIODvPE_001");
+    expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].instanceName).toBe("rrr_001");
+    expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].volumeGroupName).toBe("ttt_001");
+
+    newVnfs = service.cloneVnf(<any>{
+      "vfModules": {
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi": {
+            "instanceName": "rrr",
+            "volumeGroupName": "ttt"
+          }
+        }
+      },
+      "originalName": null,
+      "trackById": "pfs1f0len3",
+      "instanceName": "2017488_ADIODvPE"
+    }, "2017-488_ADIOD-vPE 0");
+
+    expect(newVnfs.instanceName).toBe("2017488_ADIODvPE_002");
+    expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].instanceName).toBe("rrr_002");
+    expect(newVnfs.vfModules['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2']['2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2mtlfi'].volumeGroupName).toBe("ttt_002");
+  });
+
+  test('ensure name is unique - send new name - shouldn\'t change name', () => {
+    service.existingNames = {
+      "2017488_adiodvpe": "",
+      "uniqueinstancename": ""
+    };
+    const name = "uniqueInstanceName-1";
+    let uniqueName: string = service.ensureUniqueNameOrGenerateOne(name);
+    expect(uniqueName).toEqual(name);
+  });
+
+  test('ensure name is unique send existing name should change name', () => {
+    service.existingNames = {
+      "2017488_adiodvpe": "",
+      "uniqueinstancename-1": ""
+    };
+    const name = "uniqueInstanceName-1";
+    let uniqueName: string = service.ensureUniqueNameOrGenerateOne(name);
+    expect(uniqueName).toEqual(name + "_001");
+  });
+
+  test('isAlreadyExist - send new name should return false', () => {
+    service.existingNames = {
+      "2017488_adiodvpe": "",
+      "uniqueinstancename": ""
+    };
+    const name = "uniqueinstancename-1";
+    let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
+    expect(isExist).toBeFalsy();
+  });
+
+  test('isAlreadyExist - send existing name should return true', () => {
+    service.existingNames = {
+      "2017488_adiodvpe": "",
+      "uniqueinstancename-1": ""
+    };
+    const name = "uniqueinstancename-1";
+    let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
+    expect(isExist).toBeTruthy();
+  });
+
+  test('isAlreadyExist - send existing name case insensitive should return true', () => {
+    service.existingNames = {
+      "2017488_adiodvpe": "",
+      "uniqueinstancename-1": ""
+    };
+    const name = "uniqueInstanceName-1";
+    let isExist: boolean = service.isAlreadyExists(name, service.existingNames);
+    expect(isExist).toBeTruthy();
+  });
+
+  test('getNumberAsPaddingString should return 001 if padding is 000 and val is 1 string', () => {
+    let paddingNumber: string = service.getNumberAsPaddingString(1, '0000');
+    expect(paddingNumber).toEqual('0001');
+  });
+
+  test('getNumberAsPaddingString should return 010 if padding is 000 and val is 10 string', () => {
+    let paddingNumber: string = service.getNumberAsPaddingString(10, '0000');
+    expect(paddingNumber).toEqual('0010');
+  });
+
+  test('generateVNFUniqueName should return the next free number', () => {
+    const vnfName: string = "VF_vMee 0";
+    let result: string = service.generateUniqueStoreKey(
+      "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+      vnfName,
+      getExistingVNFs(),
+      {}
+    );
+
+    expect(result).toEqual(vnfName + ":0003");
+  });
+
+  test('generateVNFUniqueName on duplicate multi vnfs should return the next free number', () => {
+      spyOn(service, 'openDuplicateModal');
+      service.openDuplicateModal(null, null, null,null, 2, null, null);
+
+      expect(service.openDuplicateModal).toHaveBeenCalledWith(null, null, null,null, 2, null, null);
+  });
+
+
+  test('isEnabled should return false if node has  missing data', () => {
+    let node  = {
+      data : {
+        missingData: true,
+        menuActions : {
+          duplicate : () => {
+
+          }
+        }
+      }
+    };
+    let result : boolean = service.isEnabled(<any>node, null, null);
+    expect(result).toBeFalsy();
+  });
+
+  test('isEnabled should return true if not reach to max', () => {
+    let node  = {
+      data : {
+        missingData: false, modelName : "vnfModelName" , modelId : "vnfModelId", type : "VF", children: [], modelCustomizationId : "vnfModelId",modelUniqueId: "vnfModelId",
+        menuActions : {
+          duplicate : () => {
+
+          }
+        }
+      }
+    };
+    let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
+    expect(result).toBeTruthy();
+  });
+
+  test('isEnabled should return false if reach to max', () => {
+    let node  = {
+      data : {
+        missingData: false, modelName : "vnfModelName2" , modelId : "vnfModelId2", type : "VF" ,children: [],
+        menuActions : {
+          duplicate : () => {
+
+          }
+        }
+      }
+    };
+    let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
+    expect(result).toBeFalsy();
+  });
+
+  test('isEnabled should return true if max is null', () => {
+    let node  = {
+      data : {
+        missingData: false, modelName : "vnfModelName3" , modelId : "vnfModelId3",type : "VF",  children: [], modelUniqueId: "vnfModelId3",
+        menuActions : {
+          duplicate : () => {
+
+          }
+        }
+      }
+    };
+    let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
+    expect(result).toBeTruthy();
+  });
+
+  test('isEnabled should return false if type is vf module', () => {
+    let node  = {
+      data : {
+        missingData: false, modelName : "vnfModelName3" , modelId : "vnfModelId3",type : "VFModule",  children: [],
+        menuActions : {
+        }
+      }
+    };
+    let result : boolean = service.isEnabled(<any>node, <any>getStoreState(), "serviceId");
+    expect(result).toBeFalsy();
+  });
+
+  test('getRemainsVNFinstance should return the remains 1 VNF', () => {
+    let result : number = service.getRemainsInstance("vnfModelId", "vnfModelName" , "serviceId" , <any>getStoreState(), <any>{data : {type : 'VF'}});
+    expect(result).toBe(1);
+  });
+
+  test('getRemainsVNFinstance should return the remains  0 VNF', () => {
+    let result : number = service.getRemainsInstance("vnfModelId2", "vnfModelName2" , "serviceId" , <any>getStoreState(),<any>{data : {type : 'VF'}});
+    expect(result).toBe(0);
+  });
+
+  test('isVNFChildrensHasMissingData should return true if vnf missing data = true', () => {
+    let result : boolean = service.hasMissingData(<any>getTreeNode(true,false));
+    expect(result).toBeTruthy();
+  });
+
+  test('isVNFChildrensHasMissingData return should false if vnf missing data = false', () => {
+    let result : boolean = service.hasMissingData(<any>getTreeNode(false,false));
+    expect(result).toBeFalsy();
+  });
+
+  test('isVNFChildrensHasMissingData should return true if vfModule missing data = true', () => {
+    let result : boolean = service.hasMissingData(<any>getTreeNode(false,true));
+    expect(result).toBeTruthy();
+  });
+
+  test('isVNFChildrensHasMissingData should return false if no children and  vfModule missing data = false', () => {
+    let node = <any>getTreeNode(false,false);
+    node.data.children = [];
+    let result : boolean = service.hasMissingData(node);
+    expect(result).toBeFalsy();
+  });
+
+  function getExistingVNFs(){
+    return {"VF_vMee 0":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"}},"VF_vMee 0:0001":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"},"originalName":"VF_vMee 0"},"VF_vMee 0:0002":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1dgbxq":{"modelInfo":{"modelInvariantId":"98a7c88b-b577-476a-90e4-e25a5871e02b","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelName":"VfVmee..vmme_vlc..module-1","modelVersion":"2","modelCustomizationId":"55b1be94-671a-403e-a26c-667e9c47d091","modelCustomizationName":"VfVmee..vmme_vlc..module-1"},"instanceParams":[{}]}}},"productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","lineOfBusiness":"ONAP","platformName":"platform","modelInfo":{"modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationId":"91415b44-753d-494c-926a-456a9172bbb9","modelCustomizationName":"VF_vMee 0"},"originalName":"VF_vMee 0"}}
+  }
+
+  function getStoreState(){
+    return {
+      getState() {
+        return {
+          service : {
+            serviceHierarchy: {
+              "serviceId" : {
+                vnfs : {
+                  "vnfModelName" : {
+                    properties : {
+                      ecomp_generated_naming: "false",
+                      max_instances : 2
+                    }
+                  },
+                  "vnfModelName2" : {
+                    properties : {
+                      ecomp_generated_naming: "false",
+                      max_instances  : 2
+                    }
+                  },
+                  "vnfModelName3" : {
+                    properties : {
+                      ecomp_generated_naming: "false",
+                    }
+                  }
+                }
+              }
+            },
+            serviceInstance : {
+              "serviceId" : {
+                existingVNFCounterMap : {
+                  "vnfModelId" : 1,
+                  "vnfModelId2" : 2,
+                  "vnfModelId3" : 0
+                }
+              }
+
+            }
+          }
+        }
+      }
+    }
+  }
+
+
+  function getTreeNode(VNfMissingData : boolean, vfModuleMissingData : boolean){
+    return {
+      data : {
+        children : vfModuleMissingData ?
+          [{
+            missingData : true
+          }] :
+          [{
+            missingData : false
+          }
+        ],
+        missingData : VNfMissingData
+      }
+    }
+  }
+});
+
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/duplicate/duplicate.service.ts
new file mode 100644 (file)
index 0000000..e695edf
--- /dev/null
@@ -0,0 +1,189 @@
+import { Injectable } from '@angular/core';
+import { ITreeNode } from 'angular-tree-component/dist/defs/api';
+import { AppState } from '../../../shared/store/reducers';
+import { LogService } from '../../../shared/utils/log/log.service';
+import { NgRedux } from '@angular-redux/store';
+import {VnfInstance} from "../../../shared/models/vnfInstance";
+import {VfModuleMap} from "../../../shared/models/vfModulesMap";
+import * as _ from "lodash";
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {TypeNodeInformation} from "../typeNodeInformation.model";
+import { SdcUiServices} from "onap-ui-angular";
+import { SdcUiCommon} from "onap-ui-angular";
+import {changeInstanceCounter, duplicateBulkInstances} from "../../../shared/storeUtil/utils/general/general.actions";
+import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
+
+@Injectable()
+export class DuplicateService {
+
+  constructor(private _logService : LogService,  private _store: NgRedux<AppState>, modalService: SdcUiServices.ModalService) {
+    this.modalService = modalService;
+  }
+
+  numberOfDuplicates:number;
+  setNumberOfDuplicates(numberOfDuplicates: number) {
+    this.numberOfDuplicates = numberOfDuplicates;
+  }
+
+  currentInstanceId: string = null;
+  currentServiceId: string = null;
+  maxNumberOfDuplicate: number = 0;
+  storeKey: string = null;
+  padding = '0000';
+  modalService: SdcUiServices.ModalService;
+  store : NgRedux<AppState>;
+  existingNames : {[key: string] : any};
+  currentNode : ITreeNode = null;
+
+
+
+  canDuplicate(node: ITreeNode): boolean {
+    let reduxState = <AppState>JSON.parse(sessionStorage.getItem('reduxState'));
+    return reduxState.global.flags['FLAG_DUPLICATE_VNF'] && (node.data.type === 'VF' || node.data.type === 'VL');
+  }
+
+  isEnabled(node: ITreeNode, store: NgRedux<AppState>, serviceId : string): boolean {
+    if(!_.isNil(node) && !_.isNil(node.data.menuActions['duplicate'])){
+      if(this.hasMissingData(node)) return false;
+      const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node);
+      const max : number = store.getState().service.serviceHierarchy[serviceId][typeNodeInformation.hierarchyName][node.data.modelName].properties['max_instances'] || 1;
+      const currentExisting: number = store.getState().service.serviceInstance[serviceId][typeNodeInformation.existingMappingCounterName][node.data.modelUniqueId];
+
+      return max - currentExisting > 0;
+    }else {
+      return false;
+    }
+  }
+
+  hasMissingData(node : ITreeNode): boolean {
+    if(!_.isNil(node)){
+      if(node.data.missingData) return true;
+      if(!_.isNil(node.data.children)){
+        for(let child of node.data.children) {
+          if(child.missingData){
+            return true;
+          }
+        }
+      }
+
+    }
+    return false;
+  }
+
+  getRemainsInstance(modelId : string, modelName : string, serviceId : string, store: NgRedux<AppState>, node : ITreeNode) : number {
+    const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node);
+    const properties  = store.getState().service.serviceHierarchy[serviceId][typeNodeInformation.hierarchyName][modelName].properties;
+    const currentExisting : number = store.getState().service.serviceInstance[serviceId][typeNodeInformation.existingMappingCounterName][modelId];
+    return (!_.isNil(properties) && !_.isNil(properties['max_instances'])) ? properties['max_instances'] - currentExisting : null;
+  }
+
+
+
+  openDuplicateModal(currentServiceId: string, currentUuid: string, currentId: string, storeKey : string, numberOfDuplicate: number, _store : NgRedux<AppState>, node: ITreeNode): IModalConfig {
+    this.currentInstanceId = currentId;
+    this.currentServiceId = currentServiceId;
+    this.maxNumberOfDuplicate = this.getRemainsInstance(currentUuid, currentId, currentServiceId, _store, node);
+    this.storeKey = storeKey;
+    this.store = _store;
+    this.currentNode = node;
+
+
+    return  {
+      size: SdcUiCommon.ModalSize.medium,
+      title: 'Duplicate Node',
+      type: SdcUiCommon.ModalType.custom,
+      buttons: [
+        {text: 'Duplicate', callback: this.duplicate.bind(this, this.currentNode), closeModal: true},
+        {text: 'Cancel', closeModal: true}
+      ]
+    };
+  }
+
+  duplicate(node : ITreeNode): void {
+    const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node);
+    this.existingNames = this.store.getState().service.serviceInstance[this.currentServiceId].existingNames;
+    const toClone  = this.store.getState().service.serviceInstance[this.currentServiceId][typeNodeInformation.hierarchyName][this.storeKey];
+    let newObjects = {};
+    for(let i = 0; i < this.numberOfDuplicates; i++) {
+      const uniqueStoreKey = this.generateUniqueStoreKey(this.currentServiceId, this.currentInstanceId, this.store.getState().service.serviceInstance[this.currentServiceId][typeNodeInformation.hierarchyName], newObjects);
+      const clone = this.cloneVnf(toClone, this.currentInstanceId);
+      newObjects[uniqueStoreKey] = clone;
+    }
+    this.store.dispatch(duplicateBulkInstances(this.currentServiceId, newObjects, this.existingNames, node));
+    this.store.dispatch(changeInstanceCounter(toClone.modelInfo.modelUniqueId, this.currentServiceId, this.numberOfDuplicates, node));
+    this._logService.info("Duplicate " + this.storeKey + " serviceId: " + this.currentServiceId + "number of duplicate: " + this.numberOfDuplicates, toClone);
+  }
+
+
+  cloneVnf(vnf : VnfInstance, originalName: string): VnfInstance {
+    let newUniqueVnf : VnfInstance = _.cloneDeep(vnf);
+
+    newUniqueVnf.originalName = originalName;
+    newUniqueVnf.trackById = DefaultDataGeneratorService.createRandomTrackById();
+    if (!_.isNil(vnf.instanceName)){
+      newUniqueVnf.instanceName = this.ensureUniqueNameOrGenerateOne(vnf.instanceName);
+    }
+
+    for (let vf_module_model_name in  vnf.vfModules) {
+      const vfModuleModel: VfModuleMap = vnf.vfModules[vf_module_model_name];
+      for (let vfModule in vfModuleModel) {
+        newUniqueVnf.vfModules[vf_module_model_name][vfModule].trackById = DefaultDataGeneratorService.createRandomTrackById();
+        if (!_.isNil(vfModuleModel[vfModule].instanceName)){
+          newUniqueVnf.vfModules[vf_module_model_name][vfModule].instanceName = this.ensureUniqueNameOrGenerateOne(vfModuleModel[vfModule].instanceName);
+        }
+        if (!_.isNil(vfModuleModel[vfModule].volumeGroupName)){
+          newUniqueVnf.vfModules[vf_module_model_name][vfModule].volumeGroupName = this.ensureUniqueNameOrGenerateOne(vfModuleModel[vfModule].volumeGroupName);
+        }
+      }
+    }
+    return newUniqueVnf;
+  }
+
+  ensureUniqueNameOrGenerateOne(instanceName){
+    let uniqueInstanceName = instanceName;
+    if (this.isAlreadyExists(instanceName, this.existingNames)) {
+      uniqueInstanceName = this.generateNextUniqueName(instanceName, this.existingNames);
+      this.existingNames[uniqueInstanceName.toLowerCase()] = "";
+    }
+    return uniqueInstanceName;
+  }
+
+
+  isAlreadyExists(name : string, existingNames : {[key: string] : any}){
+    return _.has(existingNames, name.toLowerCase());
+  }
+
+  generateNextUniqueName(name : string, existingNames : {[key: string] : any})  :string{
+    let suffix = "000";
+    let counter = 1;
+    if (name.match(/^.*_[\d]{3}$/)){
+      name = name.substring(0, name.length - 4);
+    }
+
+    while(true){
+      let paddingNumber : string = this.getNumberAsPaddingString(counter, suffix);
+      let candidateUniqueName = name + '_' + paddingNumber;
+      if(!this.isAlreadyExists(candidateUniqueName, existingNames)){
+        return candidateUniqueName;
+      }
+      counter++;
+    }
+  }
+
+  generateUniqueStoreKey(serviceId : string, objectName : string, existing : any, newObjects: any) : string {
+    let counter = 1;
+    while(true){
+      let paddingNumber : string = this.getNumberAsPaddingString(counter, this.padding);
+      const name = objectName + ':' + paddingNumber;
+      if(_.isNil(existing[name]) && _.isNil(newObjects[name])){
+        return name;
+      }
+      counter++;
+    }
+  }
+
+  getNumberAsPaddingString(val: number, padding: string): string {
+    const str = "" + val;
+    return padding.substring(0, padding.length - str.length) + str;
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.spec.ts
new file mode 100644 (file)
index 0000000..56bf94f
--- /dev/null
@@ -0,0 +1,24 @@
+import {DynamicInputsService} from "./dynamicInputs.service";
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {NgReduxTestingModule} from "@angular-redux/store/testing";
+describe('DynamicInputs  service', () => {
+  let injector;
+  let service: DynamicInputsService;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, NgReduxTestingModule],
+      providers: [
+        DynamicInputsService
+      ]
+    });
+    await TestBed.compileComponents();
+    injector = getTestBed();
+    service = injector.get(DynamicInputsService);
+  })().then(done).catch(done.fail));
+
+  test('DynamicInputs should be defined', () => {
+    expect(service).toBeDefined();
+  });
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/dynamicInputs.service.ts
new file mode 100644 (file)
index 0000000..cb0e7cf
--- /dev/null
@@ -0,0 +1,143 @@
+import {Injectable} from "@angular/core";
+import {Utils} from "../../../shared/utils/utils";
+import {Constants} from "../../../shared/utils/constants";
+import Parameter = Constants.Parameter;
+
+@Injectable()
+export class DynamicInputsService {
+  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) {
+                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;
+          }
+        }
+      }
+    }
+  };
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/basic.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/basic.model.info.ts
new file mode 100644 (file)
index 0000000..51b6cfa
--- /dev/null
@@ -0,0 +1,121 @@
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../available-models-tree/available-models-tree.service";
+
+export interface ILevelNodeInfo {
+  /** Name of the key inside the serviceHierarchy object **/
+  name: string;
+
+  /** Type of the object**/
+  type: string;
+
+  /** Child name inside the of the serviceHierarchy object (if exist) **/
+  childName?: string;
+
+  /** Child type the of object (if exist) **/
+  childType?: string;
+
+  /** model type name **/
+  typeName?: string;
+
+  /** is instance failed **/
+  isFailed?: boolean;
+
+  /** number of failed **/
+  numberOfFailed?: number;
+
+  /***********************************************************
+   * return node position
+   * @param instance - instance
+   ************************************************************/
+  getNodePosition(instance, deepNodeName? : string) : number;
+
+  /***********************************************************
+   * return if user should provide instance name or not
+   * @param currentModel - The model of current object
+   * @param parentModel - The parent model of current object.
+   ************************************************************/
+  isEcompGeneratedNaming(currentModel, parentModel?): boolean;
+
+
+  /***********************
+   * update node position
+   ***********************/
+  updatePosition(node, that, instanceId, parentStoreKey?) : void;
+
+  /***********************************************************
+   * return object instance
+   * @param modelId - The model id
+   * @param serviceHierarchy - The serviceHierarchy store
+   * @param instance - existing instance details
+   ************************************************************/
+  getModel(modelId: string, instance: any, serviceHierarchy): any;
+
+  /***********************************************************
+   * return dynamic inputs of current model
+   * @param currentModel - The model of current object
+   ************************************************************/
+  updateDynamicInputsDataFromModel(currentModel): any;
+
+  /***********************************************************
+   * return tree node instance
+   * @param instance - The model of current object
+   * @param model - The model of current object
+   * @param parentModel
+   * @param storeKey - instance storeKey if exist (for duplicate)
+   ************************************************************/
+  createInstanceTreeNode(instance: any, model: any, parentModel: any, storeKey: string): any
+
+  /***********************************************************
+   * return if instance has some missing data
+   * @param instance - The instance of current object
+   * @param dynamicInputs
+   * @param isEcompGeneratedNaming - boolean
+   ************************************************************/
+  hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean;
+
+  /************************
+   * return object tooltip
+   ************************/
+  getTooltip(): string;
+
+  /************************
+   * return object type
+   ************************/
+  getType(): string;
+
+  /************************************
+   * return child model option object
+   ***********************************/
+  getNextLevelObject(): any;
+
+  /***********************************************************
+   * open popup
+   * @param node - current ITrees node
+   * @param serviceModelId - service id
+   ************************************************************/
+  onClickAdd(node: ITreeNode, serviceModelId: string): void;
+
+  /***********************************************************
+   * get number of existing node instance
+   * @param node - current ITrees node
+   * @param serviceModelId - service id
+   ************************************************************/
+  getNodeCount(node: ITreeNode, serviceModelId: string): number;
+
+  /***********************************************************
+   * should show node icon
+   * @param node - current ITrees node
+   * @param serviceModelId - service id
+   ************************************************************/
+  showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons;
+
+  /***********************************************************
+   * should return list of actions and there methods
+   * @param node - current ITrees node
+   * @param serviceModelId
+   ************************************************************/
+  getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } };
+
+
+  onSelectedNode(node : ITreeNode): void
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.spec.ts
new file mode 100644 (file)
index 0000000..d99ec3b
--- /dev/null
@@ -0,0 +1,1500 @@
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {ConfigurationModelInfo} from "./configuration.model.info";
+import {SharedTreeService} from "../../shared.tree.service";
+
+describe('Vnf Model Info', () => {
+  let  _dynamicInputsService : DynamicInputsService;
+  let  _sharedTreeService : SharedTreeService;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, NgReduxTestingModule],
+      providers: [
+        MockNgRedux,
+        SharedTreeService,
+        DynamicInputsService]
+    });
+    await TestBed.compileComponents();
+  })().then(done).catch(done.fail));
+
+  test('ConfigurationModelInfo should be defined', () => {
+    expect(ConfigurationModelInfo).toBeDefined();
+  });
+
+  test('ConfigurationModelInfo should defined extra details', () => {
+    let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService);
+    expect(configurationModelInfo.name).toEqual('configurations');
+    expect(configurationModelInfo.type).toEqual('Configuration');
+  });
+
+  test('isEcompGeneratedNaming should return false', () => {
+    let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService);
+    let isEcompGeneratedNaming: boolean = configurationModelInfo.isEcompGeneratedNaming();
+    expect(isEcompGeneratedNaming).toBeTruthy();
+  });
+
+  test('getTooltip should return "Configuration"', () => {
+    let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService);
+    let tooltip: string = configurationModelInfo.getTooltip();
+    expect(tooltip).toEqual('Configuration');
+  });
+
+  test('getType should return "Configuration"', () => {
+    let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService);
+    let tooltip: string = configurationModelInfo.getType();
+    expect(tooltip).toEqual('Configuration');
+  });
+
+  test('getModel should return Configuration model', () => {
+    let configurationModelInfo: ConfigurationModelInfo = new ConfigurationModelInfo(_dynamicInputsService, _sharedTreeService);
+    let model = configurationModelInfo.getModel('2017-388_ADIOD-vPE 1__configuration', getServiceHierarchy());
+    expect(model.uuid).toEqual('0903e1c0-8e03-4936-b5c2-260653b96413');
+  });
+
+
+  function getServiceHierarchy(){
+    return {
+      "service": {
+        "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "name": "action-data",
+        "version": "1.0",
+        "toscaModelURL": null,
+        "category": "",
+        "serviceType": "",
+        "serviceRole": "",
+        "description": "",
+        "serviceEcompNaming": "false",
+        "instantiationType": "Macro",
+        "inputs": {
+          "2017488_adiodvpe0_ASN": {
+            "type": "string",
+            "description": "AV/PE",
+            "entry_schema": null,
+            "inputProperties": null,
+            "constraints": [],
+            "required": true,
+            "default": "AV_vPE"
+          }
+        },
+        "vidNotions": {
+          "instantiationUI": "legacy",
+          "modelCategory": "other"
+        }
+      },
+      "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,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "max_instances": "3",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              },
+              "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",
+                "baseModule": true
+              },
+              "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              }
+            },
+            "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",
+                "baseModule": false
+              },
+              "inputs": {}
+            }
+          },
+          "vfcInstanceGroups": {}
+        }
+      },
+      "networks": {
+        "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,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {}
+        }
+      },
+      "collectionResource": {},
+      "configurations": {
+        "2017-388_ADIOD-vPE 1__configuration": {
+          "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,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {}
+        }
+
+      },
+      "fabricConfigurations": {},
+      "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          },
+          "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",
+            "baseModule": true
+          },
+          "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",
+            "baseModule": false
+          },
+          "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          }
+        },
+        "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",
+            "baseModule": false
+          },
+          "inputs": {}
+        }
+      },
+      "pnfs": {}
+    }
+  }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/configuration/configuration.model.info.ts
new file mode 100644 (file)
index 0000000..dd85ea1
--- /dev/null
@@ -0,0 +1,87 @@
+import {ILevelNodeInfo} from "../basic.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import * as _ from 'lodash';
+import {SharedTreeService} from "../../shared.tree.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+
+export class ConfigurationModelInfo implements ILevelNodeInfo{
+  constructor(private _dynamicInputsService : DynamicInputsService,
+              private _sharedTreeService : SharedTreeService){}
+  name: string = 'configurations';
+  type : string = 'Configuration';
+  typeName : string = 'C';
+
+  isEcompGeneratedNaming = () : boolean => true;
+
+  updateDynamicInputsDataFromModel = () : any => [];
+
+  getNextLevelObject = (): any => null;
+
+  getTooltip = () : string => 'Configuration';
+
+  getType = () : string => "Configuration";
+
+  /***********************************************************
+   * return configuration model
+   * @param configurationModelId - current Model id
+   * @param serviceHierarchy - serviceHierarchy
+   ************************************************************/
+  getModel = (configurationModelId : string, serviceHierarchy) : any =>{
+    if(!_.isNil(serviceHierarchy)){
+      if(!_.isNil(serviceHierarchy[this.name]) && !_.isNil(serviceHierarchy[this.name][configurationModelId])){
+        return serviceHierarchy[this.name][configurationModelId];
+      }
+    }
+    return {};
+  };
+
+  createInstanceTreeNode(instance: any, model: any, storeKey: string): any {return null;}
+
+  childName: string;
+  childType: string;
+
+  /***********************************************************
+   * return if instance has missing data
+   * @param instance - vnf instance
+   * @param dynamicInputs
+   * @param isEcompGeneratedNaming
+   ************************************************************/
+  hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+    return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, []);
+  }
+
+  onClickAdd(node: ITreeNode, serviceModelId: string): void {
+  }
+
+  getNodeCount(node: ITreeNode, serviceModelId: string): number {
+    return 0;
+  }
+
+  /***********************************************************
+   * should show node icon
+   * @param node - current ITrees node
+   * @param serviceModelId - service id
+   ************************************************************/
+  showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+    return null;
+  }
+
+  getMenuAction(node: ITreeNode, serviceModelId : string){
+    return {
+
+    }
+  }
+
+  updatePosition(that , node, instanceId): void {
+    // TODO
+  }
+
+  getNodePosition(instance): number {
+    return null;
+  }
+
+  onSelectedNode(node: ITreeNode): void {
+  }
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.spec.ts
new file mode 100644 (file)
index 0000000..206adb6
--- /dev/null
@@ -0,0 +1,1553 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {NetworkModelInfo} from "./network.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {SharedTreeService} from "../../shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {NetworkPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {DrawingBoardModes} from "../../../drawing-board.modes";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {DuplicateService} from "../../../duplicate/duplicate.service";
+class MockAppStore<T> {
+  getState() {
+    return {
+      global: {
+        'drawingBoardStatus': DrawingBoardModes.CREATE
+      },
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'networks' : {
+              'networkName' : {
+                'properties' : {
+                  'max_instances' : 1
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingNetworksCounterMap' : {
+              'networkId' : 1
+            },
+            'networks' : {
+              'networkName' :{
+                'action': 'Create',
+                'originalName' : 'networkName'
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+describe('Network Model Info', () => {
+  let injector;
+  let  _dynamicInputsService : DynamicInputsService;
+  let  _sharedTreeService : SharedTreeService;
+  let networkModel: NetworkModelInfo;
+  let _dialogService : DialogService;
+  let _networkPopupService :  NetworkPopupService;
+  let _duplicateService : DuplicateService;
+  let _iframeService : IframeService;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, NgReduxTestingModule],
+      providers: [
+        DynamicInputsService,
+        SharedTreeService,
+        DialogService,
+        NetworkPopupService,
+        IframeService,
+        DuplicateService,
+        {provide: NgRedux, useClass: MockAppStore},
+        MockNgRedux]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    _sharedTreeService = injector.get(SharedTreeService);
+    networkModel = new NetworkModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _networkPopupService, _duplicateService, null, _iframeService, MockNgRedux.getInstance());
+  })().then(done).catch(done.fail));
+
+  test('NetworkModelInfo should be defined', () => {
+    expect(NetworkModelInfo).toBeDefined();
+  });
+
+  test('NetworkModelInfo should defined extra details', () => {
+    expect(networkModel.name).toEqual('networks');
+    expect(networkModel.type).toEqual('Network');
+  });
+
+  test('isEcompGeneratedNaming should return true if = isEcompGeneratedNaming is "true" ', () => {
+    let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({
+      properties: {
+        ecomp_generated_naming: 'true'
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeTruthy();
+  });
+
+  test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
+    let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({
+      properties: {
+        ecomp_generated_naming: 'false'
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeFalsy();
+  });
+
+  test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
+    let isEcompGeneratedNaming: boolean = networkModel.isEcompGeneratedNaming({
+      properties: {}
+    });
+    expect(isEcompGeneratedNaming).toBeFalsy();
+  });
+
+  test('getTooltip should return "VF"', () => {
+    let tooltip: string = networkModel.getTooltip();
+    expect(tooltip).toEqual('Network');
+  });
+
+  test('getType should return "VF"', () => {
+    let tooltip: string = networkModel.getType();
+    expect(tooltip).toEqual('Network');
+  });
+
+  test('getNextLevelObject should return null', () => {
+    let nextLevel = networkModel.getNextLevelObject();
+    expect(nextLevel).toBeNull();
+  });
+
+  test('updateDynamicInputsDataFromModel should return empty array', () => {
+    let dynamicInputs = networkModel.updateDynamicInputsDataFromModel({});
+    expect(dynamicInputs).toEqual([]);
+  });
+
+  test('getModel should return Network model', () => {
+    let model = networkModel.getModel('2017-388_ADIOD-vPE 1_1', <any>{}, getServiceHierarchy());
+    expect(model.type).toEqual('VL');
+  });
+
+  test('showNodeIcons should return false if reachLimit of max', ()=>{
+    let serviceId : string = 'servicedId';
+    let node = {
+      data : {
+        id : 'networkId',
+        name : 'networkName',
+        modelCustomizationId : 'modelCustomizationId'
+      }
+    };
+    jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global : {},
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'networks' : {
+              'networkName' : {
+                'properties' : {
+                  'max_instances' : 1
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingNetworksCounterMap' : {
+              'modelCustomizationId' : 1
+            },
+            'networks' : {
+              'networkName' :{
+
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let result = networkModel.showNodeIcons(<any>node, serviceId);
+    expect(result).toEqual(new AvailableNodeIcons(true , false));
+  });
+
+  test('showNodeIcons should return true if not reachLimit of max', ()=>{
+    let serviceId : string = 'servicedId';
+    let node = {
+      data : {
+        id : 'networkId',
+        name : 'networkName'
+      }
+    };
+    jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global : {},
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'networks' : {
+              'networkName' : {
+                'properties' : {
+                  'max_instances' : 2
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingNetworksCounterMap' : {
+              'networkId' : 1
+            },
+            'networks' : {
+              'networkName' :{
+
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let result = networkModel.showNodeIcons(<any>node, serviceId);
+    expect(result).toEqual(new AvailableNodeIcons(true , false));
+  });
+
+  test('getNodeCount should return number of nodes', ()=>{
+    let serviceId : string = 'servicedId';
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global : {},
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'networks' : {
+              'networkName' : {
+                'properties' : {
+                  'max_instances' : 1
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingNetworksCounterMap' : {
+              'modelCustomizationId' : 1
+            },
+            'networks' : {
+              'networkName' :{
+                'action': 'Create',
+                'originalName' : 'networkName'
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let node = {
+      data : {
+        id : 'networkId',
+        name : 'networkName',
+        action: 'Create',
+        modelCustomizationId : "modelCustomizationId",
+        modelUniqueId: "modelCustomizationId"
+      }
+    };
+    let result = networkModel.getNodeCount(<any>node , serviceId);
+    expect(result).toEqual(1);
+
+    node.data.modelCustomizationId = 'networkId_notExist';
+    node.data.modelUniqueId = 'networkId_notExist';
+    result = networkModel.getNodeCount(<any>node , serviceId);
+    expect(result).toEqual(0);
+  });
+
+  test('getMenuAction: showAuditInfoNetwork', ()=>{
+
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global: {
+        "drawingBoardStatus": DrawingBoardModes.RETRY
+      }
+    });
+    jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
+    let node = {
+      data : {
+        "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "action": "Create",
+        "isFailed": true,
+      }
+    };
+    let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
+    let result = networkModel.getMenuAction(<any>node, serviceModelId);
+    spyOn(result['showAuditInfo'], 'method');
+    expect(result['showAuditInfo']).toBeDefined();
+    expect(result['showAuditInfo'].visible(node)).toBeTruthy();
+    expect(result['showAuditInfo'].enable(node)).toBeTruthy();
+    result['showAuditInfo']['method'](node, serviceModelId);
+    expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId);
+  });
+
+
+  function getServiceHierarchy(){
+    return {
+      "service": {
+        "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "name": "action-data",
+        "version": "1.0",
+        "toscaModelURL": null,
+        "category": "",
+        "serviceType": "",
+        "serviceRole": "",
+        "description": "",
+        "serviceEcompNaming": "false",
+        "instantiationType": "Macro",
+        "inputs": {
+          "2017488_adiodvpe0_ASN": {
+            "type": "string",
+            "description": "AV/PE",
+            "entry_schema": null,
+            "inputProperties": null,
+            "constraints": [],
+            "required": true,
+            "default": "AV_vPE"
+          }
+        },
+        "vidNotions": {
+          "instantiationUI": "legacy",
+          "modelCategory": "other"
+        }
+      },
+      "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,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "max_instances": "3",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              },
+              "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",
+                "baseModule": true
+              },
+              "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              }
+            },
+            "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",
+                "baseModule": false
+              },
+              "inputs": {}
+            }
+          },
+          "vfcInstanceGroups": {}
+        }
+      },
+      "networks": {
+        "2017-388_ADIOD-vPE 1_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,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": "VL",
+          "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+          "vfModules": {},
+          "volumeGroups": {},
+          "vfcInstanceGroups": {}
+        }
+      },
+      "collectionResource": {},
+      "configurations": {},
+      "fabricConfigurations": {},
+      "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          },
+          "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",
+            "baseModule": true
+          },
+          "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",
+            "baseModule": false
+          },
+          "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          }
+        },
+        "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",
+            "baseModule": false
+          },
+          "inputs": {}
+        }
+      },
+      "pnfs": {}
+    }
+  }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/network/network.model.info.ts
new file mode 100644 (file)
index 0000000..3d99750
--- /dev/null
@@ -0,0 +1,264 @@
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {ILevelNodeInfo} from "../basic.model.info";
+import {NetworkInstance} from "../../../../../shared/models/networkInstance";
+import {NetworkModel} from "../../../../../shared/models/networkModel";
+import {NetworkTreeNode} from "../../../../../shared/models/networkTreeNode";
+import {SharedTreeService} from "../../shared.tree.service";
+import {InputType} from "../../../../../shared/models/inputTypes";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import {
+  GenericFormPopupComponent,
+  PopupType
+} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {DialogService} from "ng2-bootstrap-modal";
+import {NetworkPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import * as _ from "lodash";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {DuplicateVnfComponent} from "../../../duplicate/duplicate-vnf.component";
+import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {SdcUiServices} from "onap-ui-angular";
+import {DuplicateService} from "../../../duplicate/duplicate.service";
+import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
+import {
+  deleteActionNetworkInstance,
+  undoDeleteActionNetworkInstance,
+  updateNetworkPosition
+} from "../../../../../shared/storeUtil/utils/network/network.actions";
+import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
+
+export class NetworkModelInfo implements ILevelNodeInfo {
+  constructor(private _dynamicInputsService: DynamicInputsService,
+              private _sharedTreeService: SharedTreeService,
+              private _dialogService: DialogService,
+              private _networkPopupService: NetworkPopupService,
+              private _duplicateService: DuplicateService,
+              private modalService: SdcUiServices.ModalService,
+              private _iframeService: IframeService,
+              private _store: NgRedux<AppState>) {
+  }
+
+  name: string = 'networks';
+  type: string = 'Network';
+  typeName: string = 'N';
+
+  /***********************************************************
+   * return model dynamic inputs
+   * @param currentModel - current Model object
+   ************************************************************/
+  isEcompGeneratedNaming(currentModel): boolean {
+    const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
+    return ecompGeneratedNaming === "true";
+  }
+
+  updateDynamicInputsDataFromModel = (currentModel): any => {
+    let displayInputs;
+    return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
+  };
+
+  /***********************************************************
+   * return network model
+   * @param networkModelId - current Model id
+   * @param instance
+   * @param serviceHierarchy - serviceHierarchy
+   ************************************************************/
+  getModel = (networkModelId: string, instance: NetworkInstance, serviceHierarchy): NetworkModel => {
+    const originalModelName = instance.originalName ? instance.originalName : networkModelId;
+    return new NetworkModel(serviceHierarchy[this.name][originalModelName]);
+  };
+
+
+  /***********************************************************
+   * return network instance tree node
+   * @param instance - network instance
+   * @param model - network model
+   * @param parentModel
+   * @param storeKey - store key if exist
+   ************************************************************/
+  createInstanceTreeNode = (instance: NetworkInstance, model: NetworkModel, parentModel, storeKey: string): NetworkTreeNode => {
+    let node = new NetworkTreeNode(instance, model, storeKey);
+    node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
+    node.typeName = this.typeName;
+    node.menuActions = this.getMenuAction(<any>node, model.uuid);
+    node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
+    node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+    node = this._sharedTreeService.addingStatusProperty(node);
+    return node;
+  };
+
+  /***********************************************************
+   * return next level object (null because is last level)
+   ************************************************************/
+  getNextLevelObject(): any {
+    return null;
+  }
+
+  getTooltip = (): string => 'Network';
+
+  getType = (): string => 'Network';
+
+  /***********************************************************
+   * return if instance has missing data
+   * @param instance - vnf instance
+   * @param dynamicInputs
+   * @param isEcompGeneratedNaming
+   ************************************************************/
+  hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+    return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
+  }
+
+
+  /***********************************************************
+   * return if instance has missing data
+   * @param node - Network node
+   * @param serviceModelId - current service id
+   ************************************************************/
+  onClickAdd(node, serviceModelId: string): void {
+    this._dialogService.addDialog(GenericFormPopupComponent, <any>{
+      type: PopupType.NETWORK,
+      uuidData: {
+        serviceId: serviceModelId,
+        networkId: node.data.name,
+        networkStoreKey: null,
+        type: 'VL',
+        popupService: this._networkPopupService
+      },
+      node: node,
+      isUpdateMode: false
+    });
+  }
+
+  /***********************************************************
+   * return number of existing instances
+   * @param node - Network node
+   * @param serviceModelId - current service id
+   ************************************************************/
+  getNodeCount(node: ITreeNode, serviceModelId: string): number {
+    let map = null;
+    if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
+      map = this._store.getState().service.serviceInstance[serviceModelId].existingNetworksCounterMap || 0;
+      if (!_.isNil(map)) {
+        let count = map[node.data.modelUniqueId] || 0;
+        count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId , 'networks');
+        return count;
+      }
+    }
+    return 0;
+  }
+
+  /***********************************************************
+   * should show node icon
+   * @param node - current ITrees node
+   * @param serviceModelId - service id
+   ************************************************************/
+  showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+    let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ?
+      (this._store.getState().service.serviceInstance[serviceModelId].existingNetworksCounterMap[node.data.modelUniqueId] || 0) : 0;
+
+    counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId , 'networks');
+
+    const properties = this._store.getState().service.serviceHierarchy[serviceModelId].networks[node.data.name].properties;
+    const maxInstances: number = !_.isNil(properties) ? (properties.max_instances || 1) : 1;
+    const isReachedLimit = !(maxInstances > counter);
+    const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit;
+
+    return new AvailableNodeIcons(showAddIcon, isReachedLimit)
+  }
+
+  getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function }} {
+    const mode = this._store.getState().global.drawingBoardStatus;
+    return {
+      edit: {
+        method: (node, serviceModelId) => {
+          this._iframeService.addClassOpenModal('content');
+          this._dialogService.addDialog(GenericFormPopupComponent, {
+            type: PopupType.NETWORK,
+            uuidData: <any>{
+              serviceId: serviceModelId,
+              networkId: node.data.modelName,
+              networkStoreKey: node.data.networkStoreKey,
+              type: node.data.type,
+              popupService: this._networkPopupService
+            },
+            node: node,
+            isUpdateMode: true
+          });
+        },
+        visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+        enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
+      },
+      showAuditInfo: {
+        method: (node, serviceModelId) => {
+          let instance = this._store.getState().service.serviceInstance[serviceModelId].networks[node.data.networkStoreKey];
+          this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'NETWORK', this);
+        },
+        visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
+        enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
+      },
+      duplicate: {
+        method: (node, serviceModelId) => {
+          if (this._store.getState().global.flags['FLAG_DUPLICATE_VNF']) {
+            const storeKey = node.data.networkStoreKey;
+            let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node);
+            this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent);
+          }
+        },
+        visible: (node) => this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node),
+        enable: (node, serviceModelId) => this._duplicateService.isEnabled(node, this._store, serviceModelId)
+      },
+      remove: {
+        method: (node, serviceModelId) => {
+          let storeKey: string = node.data.networkStoreKey;
+          this._store.dispatch(removeInstance(node.data.networkStoreKey, serviceModelId, storeKey, node));
+          this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId , serviceModelId, -1, node));
+          this._sharedTreeService.selectedVNF = null;
+        },
+        visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+        enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+      },
+      delete : {
+        method : (node, serviceModelId) => {
+          if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+            this._store.dispatch(deleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
+          }else {
+            this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{
+              this._store.dispatch(deleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
+            });
+          }
+        },
+        visible: (node) => this._sharedTreeService.shouldShowDelete(node),
+        enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+      },
+      undoDelete : {
+        method : (node, serviceModelId) => {
+          if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+            this._store.dispatch(undoDeleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
+          }else {
+            this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{
+              this._store.dispatch(undoDeleteActionNetworkInstance(node.data.networkStoreKey, serviceModelId));
+            });
+          }
+        },
+        visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
+        enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+      }
+    };
+  }
+
+  /***********************************************************
+   * should update node position inside the tree
+   * @param node - current ITrees node
+   ************************************************************/
+  updatePosition(that , node, instanceId): void {
+    that.store.dispatch(updateNetworkPosition(node));
+  }
+
+  getNodePosition(instance): number {
+    return !_.isNil(instance) ? instance.position : null;
+  }
+
+  onSelectedNode(node: ITreeNode): void {
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.spec.ts
new file mode 100644 (file)
index 0000000..dcf25f5
--- /dev/null
@@ -0,0 +1,1211 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {VNFModel} from "../../../../../shared/models/vnfModel";
+import {SharedTreeService} from "../../shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {DuplicateService} from "../../../duplicate/duplicate.service";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {RelatedVnfMemberInfoModel} from "./relatedVnfMember.info.model";
+
+
+class MockAppStore<T> {
+  getState() {
+    return {}
+  }
+}
+
+
+describe('Related Vnf member Model Info', () => {
+  let injector;
+  let httpMock: HttpTestingController;
+  let  _dynamicInputsService : DynamicInputsService;
+  let  _sharedTreeService : SharedTreeService;
+
+  let _store : NgRedux<AppState>;
+  let relatedVnfMemeber: RelatedVnfMemberInfoModel;
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, NgReduxTestingModule],
+      providers: [
+        MockNgRedux,
+        DynamicInputsService,
+        DialogService,
+        VfModulePopuopService,
+        VnfPopupService,
+        DefaultDataGeneratorService,
+        SharedTreeService,
+        DuplicateService,
+        IframeService]
+    }).compileComponents();
+
+    injector = getTestBed();
+    _sharedTreeService = injector.get(SharedTreeService);
+    _store = injector.get(NgRedux);
+
+    relatedVnfMemeber = new RelatedVnfMemberInfoModel(
+      _sharedTreeService,
+      _dynamicInputsService,
+      _store);
+  });
+
+  test('relatedVnfMemeber should be defined', () => {
+    expect(relatedVnfMemeber).toBeDefined();
+  });
+
+  test('RelatedVnfMemeber should defined extra details', () => {
+    expect(relatedVnfMemeber.name).toEqual('vnfs');
+    expect(relatedVnfMemeber.type).toEqual('relatedVnfMember');
+  });
+
+  test('isEcompGeneratedNaming should return true if isEcompGeneratedNaming is "true" ', () => {
+    let isEcompGeneratedNaming: boolean = relatedVnfMemeber.isEcompGeneratedNaming(<any>{
+      properties: {
+        ecomp_generated_naming: 'true'
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeTruthy();
+  });
+
+  test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
+    let isEcompGeneratedNaming: boolean = relatedVnfMemeber.isEcompGeneratedNaming({
+      properties: {
+        ecomp_generated_naming: 'false'
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeFalsy();
+  });
+
+  test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
+    let isEcompGeneratedNaming: boolean = relatedVnfMemeber.isEcompGeneratedNaming({
+      properties: {
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeFalsy();
+  });
+
+
+  test('getTooltip should return "VF"', () => {
+    let tooltip: string = relatedVnfMemeber.getTooltip();
+    expect(tooltip).toEqual('VF');
+  });
+
+  test('getType should return "VF"', () => {
+    let tooltip: string = relatedVnfMemeber.getType();
+    expect(tooltip).toEqual('VF');
+  });
+
+  test('getNextLevelObject should be null', () => {
+    let nextLevel = relatedVnfMemeber.getNextLevelObject();
+    expect(nextLevel).toBeNull();
+  });
+
+  test('getModel should return VNF model', () => {
+    let model: VNFModel = relatedVnfMemeber.getModel('2017-388_ADIOD-vPE 1', <any>{
+      originalName : '2017-388_ADIOD-vPE 1'
+    }, getServiceHierarchy());
+    expect(model.type).toEqual('VF');
+  });
+
+
+  test('getMenuAction: delete', ()=>{
+    let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"};
+    let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+    let result = relatedVnfMemeber.getMenuAction(<any>node, serviceModelId);
+    spyOn(result['delete'], 'method');
+    expect(result['delete']).toBeDefined();
+    expect(result['delete'].visible).toBeTruthy();
+    expect(result['delete'].enable).toBeTruthy();
+    result['delete']['method'](node, serviceModelId);
+    expect(result['delete']['method']).toHaveBeenCalledWith(node, serviceModelId);
+  });
+
+
+  test('getMenuAction: undoDelete', ()=>{
+    let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"};
+    let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+    let result = relatedVnfMemeber.getMenuAction(<any>node, serviceModelId);
+    spyOn(result['undoDelete'], 'method');
+    expect(result['undoDelete']).toBeDefined();
+    expect(result['undoDelete'].visible).toBeDefined();
+    expect(result['undoDelete'].enable).toBeDefined();
+    result['undoDelete']['method'](node, serviceModelId);
+    expect(result['undoDelete']['method']).toHaveBeenCalledWith(node, serviceModelId);
+  });
+
+
+
+  function getServiceHierarchy(){
+    return {
+      "service": {
+        "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "name": "action-data",
+        "version": "1.0",
+        "toscaModelURL": null,
+        "category": "",
+        "serviceType": "",
+        "serviceRole": "",
+        "description": "",
+        "serviceEcompNaming": "false",
+        "instantiationType": "Macro",
+        "inputs": {
+          "2017488_adiodvpe0_ASN": {
+            "type": "string",
+            "description": "AV/PE",
+            "entry_schema": null,
+            "inputProperties": null,
+            "constraints": [],
+            "required": true,
+            "default": "AV_vPE"
+          }
+        },
+        "vidNotions": {
+          "instantiationUI": "legacy",
+          "modelCategory": "other"
+        }
+      },
+      "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,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "max_instances": "3",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              },
+              "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",
+                "baseModule": true
+              },
+              "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              }
+            },
+            "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",
+                "baseModule": false
+              },
+              "inputs": {}
+            }
+          },
+          "vfcInstanceGroups": {}
+        }
+      },
+      "networks": {},
+      "collectionResource": {},
+      "configurations": {},
+      "fabricConfigurations": {},
+      "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          },
+          "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",
+            "baseModule": true
+          },
+          "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",
+            "baseModule": false
+          },
+          "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          }
+        },
+        "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",
+            "baseModule": false
+          },
+          "inputs": {}
+        }
+      },
+      "pnfs": {}
+    }
+  }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/relatedVnfMember/relatedVnfMember.info.model.ts
new file mode 100644 (file)
index 0000000..b1eb109
--- /dev/null
@@ -0,0 +1,158 @@
+import {ILevelNodeInfo} from "../basic.model.info";
+import {SharedTreeService} from "../../shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import * as _ from "lodash";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {
+  deleteActionRelatedVnfMemberInstance,
+  removeRelatedVnfMemberInstance,
+  undoDeleteActionRelatedVnfMemberInstance
+} from "../../../../../shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions";
+import {VnfInstance} from "../../../../../shared/models/vnfInstance";
+import {VNFModel} from "../../../../../shared/models/vnfModel";
+import {VnfTreeNode} from "../../../../../shared/models/vnfTreeNode";
+import {InputType} from "../../../../../shared/models/inputTypes";
+
+export class RelatedVnfMemberInfoModel implements ILevelNodeInfo {
+  constructor(private _sharedTreeService: SharedTreeService,
+              private _dynamicInputsService : DynamicInputsService,
+              private _store: NgRedux<AppState>) {
+  }
+
+  name: string = 'vnfs';
+  type: string = 'relatedVnfMember';
+  typeName: string = 'VNF';
+
+  /***********************************************************
+   * return if user should provide instance name or not.
+   * @param currentModel - current Model object
+   ************************************************************/
+  isUserProvidedNaming = (currentModel): boolean => {
+    const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
+    return ecompGeneratedNaming !== undefined && ecompGeneratedNaming === "false";
+  };
+
+  /***********************************************************
+   * return model dynamic inputs
+   * @param currentModel - current Model object
+   ************************************************************/
+  updateDynamicInputsDataFromModel = (currentModel): any => {
+    let displayInputs;
+    return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
+  };
+
+  /***********************************************************
+   * return vnf model
+   * @param vnfModelId - current Model id
+   * @param instance - vnf instance
+   * @param serviceHierarchy - serviceHierarchy
+   ************************************************************/
+  getModel = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => {
+    const originalModelName = instance.originalName ? instance.originalName : vnfModelId;
+    return new VNFModel(serviceHierarchy[this.name][originalModelName]);
+  };
+
+
+  /***********************************************************
+   * return vnf instance tree node
+   * @param instance - vnf instance
+   * @param model - vnf model
+   * @param parentModel
+   * @param storeKey - store key if exist
+   ************************************************************/
+  createInstanceTreeNode = (instance: VnfInstance, model: VNFModel, parentModel, storeKey: string): VnfTreeNode => {
+    let node = new VnfTreeNode(instance, model, storeKey);
+    node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
+    node.typeName = this.typeName;
+    node.menuActions = this.getMenuAction(<any>node, model.uuid);
+    node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
+    node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+    node = this._sharedTreeService.addingStatusProperty(node);
+    return node;
+  };
+
+  /***********************************************************
+   * return next level object (null because is last level)
+   ************************************************************/
+  getNextLevelObject(): any {
+    return null;
+  }
+
+  /***********************************************************
+   * return if instance has missing data
+   * @param instance - vnf instance
+   * @param dynamicInputs
+   * @param isUserProvidedNaming
+   ************************************************************/
+  hasMissingData(instance, dynamicInputs: any, isUserProvidedNaming: boolean): boolean {
+    return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isUserProvidedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
+  }
+
+  getTooltip = (): string => 'VF';
+
+  getType = (): string => 'VF';
+
+  /***********************************************************
+   * doesn't have option from DrawingBoard model tree
+   ************************************************************/
+  onClickAdd(node, serviceModelId: string): void {}
+
+  /***********************************************************
+   * doesn't have option from DrawingBoard model tree
+   ************************************************************/
+  getNodeCount(node: ITreeNode, serviceModelId: string): number {return 0;}
+
+  /***********************************************************
+   * doesn't have option from DrawingBoard model tree
+   ************************************************************/
+  showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+    return new AvailableNodeIcons(false, false);
+  }
+
+  getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function }} {
+    return <any>{
+      remove: {
+        method: (node, serviceModelId) => {
+          this._store.dispatch(removeRelatedVnfMemberInstance(node.parent.data.vnfGroupStoreKey, node.data.vnfStoreKey, serviceModelId));
+        },
+        visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+        enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
+      },
+      delete : {
+        method : (node, serviceModelId) => {
+          this._store.dispatch(deleteActionRelatedVnfMemberInstance(node.parent.data.vnfGroupStoreKey, node.data.vnfStoreKey, serviceModelId));
+        },
+        visible: (node) => this._sharedTreeService.shouldShowDelete(node),
+        enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+      },
+      undoDelete : {
+        method : (node, serviceModelId) => {
+          this._store.dispatch(undoDeleteActionRelatedVnfMemberInstance(node.parent.data.vnfGroupStoreKey , node.data.vnfStoreKey, serviceModelId));
+
+        },
+        visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
+        enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && this._sharedTreeService.shouldShowDelete(node.parent) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+      }
+    }
+  }
+
+  isEcompGeneratedNaming = (currentModel): boolean => {
+    const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
+    return ecompGeneratedNaming === "true";
+  };
+
+
+  updatePosition(that , node, instanceId): void {
+    // TODO
+  }
+
+  getNodePosition(instance): number {
+    return null;
+  }
+
+  onSelectedNode(node: ITreeNode): void {
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.spec.ts
new file mode 100644 (file)
index 0000000..dc74525
--- /dev/null
@@ -0,0 +1,1596 @@
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {VFModuleModelInfo} from "./vfModule.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {SharedTreeService} from "../../shared.tree.service";
+import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
+import {DrawingBoardModes} from "../../../drawing-board.modes";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {ComponentInfoService} from "../../../component-info/component-info.service";
+import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
+import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model";
+import {AaiService} from "../../../../../shared/services/aaiService/aai.service";
+import {HttpClient, HttpHandler} from "@angular/common/http";
+import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service";
+class MockAppStore<T> {
+  getState() {
+    return {
+      global: {
+        'drawingBoardStatus': DrawingBoardModes.CREATE
+      }
+    }
+  }
+}
+
+describe('VFModule Model Info', () => {
+  let injector;
+  let  _dynamicInputsService : DynamicInputsService;
+  let  _sharedTreeService : SharedTreeService;
+  let  vfModuleModel: VFModuleModelInfo;
+  let _dialogService : DialogService;
+  let _vfModulePopupService : VfModulePopuopService;
+  let _iframeService : IframeService;
+  let _componentInfoService : ComponentInfoService;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, NgReduxTestingModule],
+      providers: [
+        DynamicInputsService,
+        DialogService,
+        VfModulePopuopService,
+        SharedTreeService,
+        IframeService,
+        {provide: NgRedux, useClass: MockAppStore},
+        MockNgRedux,
+        AaiService,
+        HttpClient,
+        HttpHandler,
+        FeatureFlagsService,
+        ComponentInfoService
+      ]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    _sharedTreeService = injector.get(SharedTreeService);
+    _componentInfoService = injector.get(ComponentInfoService)
+    vfModuleModel = new VFModuleModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _vfModulePopupService, _iframeService, MockNgRedux.getInstance(),_componentInfoService);
+
+  })().then(done).catch(done.fail));
+
+
+
+  test('VFModuleModelInfo should be defined', () => {
+    expect(VFModuleModelInfo).toBeDefined();
+  });
+
+  test('VnfModelInfo should defined extra details', () => {
+    expect(vfModuleModel.name).toEqual('vfModules');
+    expect(vfModuleModel.type).toEqual('Module');
+  });
+
+  test('isEcompGeneratedNaming should return true if vnf has isEcompGeneratedNaming is "true" ', () => {
+    let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
+      properties: {
+        ecomp_generated_naming: 'true'
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeTruthy();
+  });
+
+  test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
+    let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
+      properties: {
+        ecomp_generated_naming: 'false'
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeFalsy();
+  });
+
+  test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
+    let isEcompGeneratedNaming : boolean = vfModuleModel.isEcompGeneratedNaming({}, {
+      properties: {
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeFalsy();
+  });
+
+
+  test('getTooltip should return "VFModule"', () => {
+    let tooltip: string = vfModuleModel.getTooltip();
+    expect(tooltip).toEqual('VFmodule');
+  });
+
+  test('getType should return "VFModule"', () => {
+    let tooltip: string = vfModuleModel.getType();
+    expect(tooltip).toEqual('VFmodule');
+  });
+
+  test('getNextLevelObject should return null', () => {
+    let nextLevel = vfModuleModel.getNextLevelObject();
+    expect(nextLevel).toBeNull();
+  });
+
+  test('getModel should return Module model', () => {
+    let model = vfModuleModel.getModel('2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1',{}, getServiceHierarchy());
+    expect(model.uuid).toEqual('25284168-24bb-4698-8cb4-3f509146eca5');
+  });
+
+  test('showNodeIcons should return false false if reachLimit of max', ()=>{
+    let serviceId : string = 'servicedId';
+    let node = {
+      parent : {
+        data : {
+          id : 'vnfId',
+          name : 'vnfName'
+        }
+      },
+      data : {
+        id : 'vnfId',
+        name : 'vnfName'
+      }
+    };
+    _sharedTreeService.setSelectedVNF({
+      data : {
+        id : 'vfModuleId',
+        name : 'VfModuleName'
+      }
+    });
+    jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue([]);
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global : {},
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'vnfs' : {
+              'vnfName' : {
+                'properties' : {
+                  'max_instances' : 1
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingVNFCounterMap' : {
+              'vnfId' : 1
+            },
+            'vnfs' : {
+              'vnfName' :{
+
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let result = vfModuleModel.showNodeIcons(<any>node, serviceId);
+    expect(result).toEqual(new AvailableNodeIcons(false , false));
+  });
+
+  test('showNodeIcons should return true, false if reachLimit of max', ()=>{
+    let serviceId : string = 'servicedId';
+    let node = {
+      data : {
+        id : 'vfModuleId',
+        name : 'vfModuleName'
+      },
+      parent : {
+        data : {
+          id : 'vnfId',
+          name : 'vnfName'
+        }
+      }
+    };
+    jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue('vnfName');
+    jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue(['vnfName']);
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global : {},
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'vnfs' : {
+              'vnfName' : {
+                'properties' : {
+                  'max_instances' : 1
+                }
+              }
+            },
+            'vfModules' : {
+              'vfModuleName' : {
+                'properties' : {
+                  maxCountInstances : 1
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingVNFCounterMap' : {
+              'vnfId' : 1
+            },
+            'vnfs' : {
+              'vnfName' :{
+                  'originalName' : 'vnfName',
+                  'vfModules' : {
+                    'vfModuleName' : {
+
+                    }
+                  }
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let result = vfModuleModel.showNodeIcons(<any>node, 'servicedId');
+    expect(result).toEqual(new AvailableNodeIcons(true , false));
+  });
+
+
+  test('showNodeIcons should return false, true if reachLimit of max', ()=>{
+    let serviceId : string = 'servicedId';
+    let node = {
+      data : {
+        id : 'vfModuleId',
+        name : 'vfModuleName'
+      },
+      parent : {
+        data : {
+          id : 'vnfId',
+          name : 'vnfName'
+        }
+      }
+    };
+    jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue('vnfName');
+    jest.spyOn(vfModuleModel, 'getOptionalVNFs').mockReturnValue(['vnfName']);
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global : {},
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'vnfs' : {
+              'vnfName' : {
+                'properties' : {
+                  'max_instances' : 1
+                }
+              }
+            },
+            'vfModules' : {
+              'vfModuleName' : {
+                'properties' : {
+                  maxCountInstances : 2
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingVNFCounterMap' : {
+              'vnfId' : 1
+            },
+            'vnfs' : {
+              'vnfName' :{
+                'originalName' : 'vnfName',
+                'vfModules' : {
+                  'vfModuleName' : {
+
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let result = vfModuleModel.showNodeIcons(<any>node, 'servicedId');
+    expect(result).toEqual(new AvailableNodeIcons(true , false));
+  });
+
+
+  test('getOptionalVNFs should instance if exist', ()=>{
+    let serviceId : string = 'servicedId';
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global : {},
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'vnfs' : {
+              'vnfName' : {
+                'properties' : {
+                  'max_instances' : 1
+                }
+              }
+            },
+            'vfModules' : {
+              'vfModuleName' : {
+                'properties' : {
+                  maxCountInstances : 2
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingVNFCounterMap' : {
+              'vnfId' : 1
+            },
+            'vnfs' : {
+              'vnfName' :{
+                'originalName' : 'vnfName',
+                'vfModules' : {
+                  'vfModuleName' : {
+
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let node = {
+      data : {
+        id : 'vfModuleId',
+        name : 'vfModuleName'
+      },
+      parent : {
+        data : {
+          id : 'vnfId',
+          name : 'vnfName'
+        }
+      }
+    };
+    let result = vfModuleModel.getOptionalVNFs(serviceId , 'vnfName');
+    expect(result.length).toEqual(1);
+  });
+
+  test('getNodeCount should return number of nodes', ()=>{
+    let serviceId : string = 'servicedId';
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global : {},
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'vnfs' : {
+              'vnfName' : {
+                'properties' : {
+                  'max_instances' : 1
+                }
+              }
+            },
+            'vfModules' : {
+              'vfModuleName' : {
+                'properties' : {
+                  maxCountInstances : 2
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingVNFCounterMap' : {
+              'vnfId' : 1
+            },
+            'vnfs' : {
+              'vnfName' :{
+                'action': 'Create',
+                'originalName' : 'vnfName',
+                'vfModules' : {
+                  'vfModuleName' : {
+                      'vnfModuleName_111': {
+                        'action': 'Create',
+                        'modelInfo' : {
+                          modelVersionId : 'vfModuleId'
+                        }
+                      }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let node = {
+      data : {
+        id : 'vfModuleId',
+        name : 'vfModuleName',
+        'action': 'Create',
+      },
+      parent : {
+        data : {
+          id : 'vnfId',
+          name : 'vnfName',
+          'action': 'Create',
+        }
+      }
+    };
+    let result = vfModuleModel.getNodeCount(<any>node , serviceId);
+    expect(result).toEqual(1);
+  });
+
+
+  test('onClickAdd should open message box if no vnfStoreKey', ()=>{
+    jest.spyOn(_sharedTreeService, 'getSelectedVNF').mockReturnValue(null);
+    jest.spyOn(vfModuleModel, 'getDefaultVNF').mockReturnValue(null);
+    jest.spyOn(MessageBoxService.openModal, 'next');
+    vfModuleModel.onClickAdd(<any>{}, 'serviceId');
+    expect(MessageBoxService.openModal.next).toHaveBeenCalled();
+  });
+
+  test('getMenuAction: showAuditInfoVfModule', ()=>{
+    jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
+
+    let node = {
+      data : {
+        "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "action": "Create",
+        "isFailed": true,
+      }
+    };
+    let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
+    let result = vfModuleModel.getMenuAction(<any>node, serviceModelId);
+    spyOn(result['showAuditInfo'], 'method');
+    expect(result['showAuditInfo']).toBeDefined();
+    expect(result['showAuditInfo'].visible(node)).toBeTruthy();
+    expect(result['showAuditInfo'].enable(node)).toBeTruthy();
+    result['showAuditInfo']['method'](node, serviceModelId);
+    expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId);
+  });
+
+  test('Info for vfModule should be correct', () => {
+    const model = getVFModule();
+    const instance = getVFModuleInstance();
+    let actualVNFInfo = vfModuleModel.getInfoForVFModule(model,instance);
+    let expectedVNFInfo = [
+      ModelInformationItem.createInstance('Type', 'vfModule'),
+      ModelInformationItem.createInstance('Model Version', '2'),
+      ModelInformationItem.createInstance('Model Customization ID','55b1be94-671a-403e-a26c-667e9c47d091'),
+      ModelInformationItem.createInstance('Instance ID', '2c1ca484-cbc2-408b-ab86-25a2c15ce280'),
+      ModelInformationItem.createInstance('In Maintenance', true),
+      ModelInformationItem.createInstance('Base Module', false),
+      ModelInformationItem.createInstance('Min Instances', 0),
+      ModelInformationItem.createInstance('Initial Instances Count',0)
+    ];
+    expect(actualVNFInfo).toEqual(new ComponentInfoModel(ComponentInfoType.VFMODULE, expectedVNFInfo, []));
+  });
+
+  function getVFModule(){
+    return {
+      "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",
+        "baseModule":false
+      },
+      "inputs":{},
+      "volumeGroupAllowed":false
+    };
+  }
+
+  function getVFModuleInstance() {
+    return {
+      "action":"None",
+      "instanceName":"ss820f_0918_db",
+      "instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280",
+      "orchStatus":"deleted",
+      "productFamilyId":null,
+      "lcpCloudRegionId":null,
+      "tenantId":null,
+      "modelInfo":{
+        "modelCustomizationName":"VfVmee..vmme_vlc..module-1",
+        "modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9",
+        "modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750",
+        "modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
+        "modelType":"vfModule"
+      },
+      "instanceType":null,
+      "provStatus":null,
+      "inMaint":true,
+      "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
+      "originalName":"VfVmee..vmme_vlc..module-1",
+      "legacyRegion":null,
+      "lineOfBusiness":null,
+      "platformName":null,
+      "trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008",
+      "isBase":false,
+      "volumeGroupName":null
+    };
+  }
+
+
+  function getServiceHierarchy(){
+    return {
+      "service": {
+        "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "name": "action-data",
+        "version": "1.0",
+        "toscaModelURL": null,
+        "category": "",
+        "serviceType": "",
+        "serviceRole": "",
+        "description": "",
+        "serviceEcompNaming": "false",
+        "instantiationType": "Macro",
+        "inputs": {
+          "2017488_adiodvpe0_ASN": {
+            "type": "string",
+            "description": "AV/PE",
+            "entry_schema": null,
+            "inputProperties": null,
+            "constraints": [],
+            "required": true,
+            "default": "AV_vPE"
+          }
+        },
+        "vidNotions": {
+          "instantiationUI": "legacy",
+          "modelCategory": "other"
+        }
+      },
+      "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,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "max_instances": "3",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              },
+              "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",
+                "baseModule": true
+              },
+              "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              }
+            },
+            "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",
+                "baseModule": false
+              },
+              "inputs": {}
+            }
+          },
+          "vfcInstanceGroups": {}
+        }
+      },
+      "networks": {},
+      "collectionResource": {},
+      "configurations": {},
+      "fabricConfigurations": {},
+      "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          },
+          "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",
+            "baseModule": true
+          },
+          "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",
+            "baseModule": false
+          },
+          "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          }
+        },
+        "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",
+            "baseModule": false
+          },
+          "inputs": {}
+        }
+      },
+      "pnfs": {}
+    }
+  }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts
new file mode 100644 (file)
index 0000000..7db3d90
--- /dev/null
@@ -0,0 +1,388 @@
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {ILevelNodeInfo} from "../basic.model.info";
+import * as _ from "lodash";
+import {VNFModel} from "../../../../../shared/models/vnfModel";
+import {SharedTreeService} from "../../shared.tree.service";
+import {VfModuleTreeNode} from "../../../../../shared/models/vfModuleTreeNode";
+import {VfModuleInstance} from "../../../../../shared/models/vfModuleInstance";
+import {VfModule} from "../../../../../shared/models/vfModule";
+import {NgRedux} from "@angular-redux/store";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {
+  GenericFormPopupComponent,
+  PopupType
+} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {AppState} from "../../../../../shared/store/reducers";
+import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
+import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {
+  deleteActionVfModuleInstance,
+  removeVfModuleInstance,
+  undoDeleteVfModuleInstance,
+  updateVFModulePosition
+} from "../../../../../shared/storeUtil/utils/vfModule/vfModule.actions";
+import {ComponentInfoService} from "../../../component-info/component-info.service";
+import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model";
+import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
+
+export class VFModuleModelInfo implements ILevelNodeInfo {
+  constructor(private _dynamicInputsService: DynamicInputsService,
+              private _sharedTreeService: SharedTreeService,
+              private _dialogService: DialogService,
+              private _vfModulePopupService: VfModulePopuopService,
+              private _iframeService: IframeService,
+              private _store: NgRedux<AppState>,
+              private _componentInfoService: ComponentInfoService) {
+  }
+
+  name: string = 'vfModules';
+  type: string = 'Module';
+  typeName: string = 'M';
+
+  /***********************************************************
+   * return if user should provide instance name or not.
+   *        get info from parent (VNF)
+   * @param currentModel - current Model object
+   * @param parentModel - current parent Model object
+   ************************************************************/
+  isEcompGeneratedNaming(currentModel, parentModel): boolean {
+    const ecompGeneratedNaming = !_.isNil(parentModel.properties) ? parentModel.properties.ecomp_generated_naming : undefined;
+    return ecompGeneratedNaming === "true";
+  }
+
+  /***********************************************************
+   * return model dynamic inputs
+   * @param currentModel - current Model object
+   ************************************************************/
+  updateDynamicInputsDataFromModel = (currentModel): any => {
+    let displayInputs = _.isNil(currentModel) ? [] : currentModel.inputs;
+    return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
+  };
+
+  /***********************************************************
+   * return vfModule model
+   * @param vfModuleModelId - current Model id
+   * @param instance
+   * @param serviceHierarchy - serviceHierarchy
+   ************************************************************/
+  getModel = (vfModuleModelId: string, instance, serviceHierarchy): any => {
+    if (!_.isNil(serviceHierarchy)) {
+      if (!_.isNil(serviceHierarchy[this.name]) && !_.isNil(serviceHierarchy[this.name][vfModuleModelId])) {
+        return serviceHierarchy[this.name][vfModuleModelId];
+      }
+    }
+    return {};
+  };
+
+  createNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string, index: number): VfModuleTreeNode {
+    let dynamicModelName = Object.keys(instance)[index];
+    instance = instance[Object.keys(instance)[index]];
+    const isEcompGeneratedNaming: boolean = this.isEcompGeneratedNaming(currentModel, parentModel);
+
+    const dynamicInputs = this.updateDynamicInputsDataFromModel(currentModel);
+    let newVfModule: VfModuleTreeNode = new VfModuleTreeNode(instance, currentModel, modelName, dynamicInputs, isEcompGeneratedNaming, dynamicModelName);
+
+    newVfModule.missingData = this._sharedTreeService.hasMissingData(instance, newVfModule.dynamicInputs, isEcompGeneratedNaming, []);
+    newVfModule.typeName = this.typeName;
+    newVfModule.menuActions = this.getMenuAction(<any>newVfModule, currentModel.uuid);
+    newVfModule.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
+    newVfModule.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+
+    newVfModule = this._sharedTreeService.addingStatusProperty(newVfModule);
+    return newVfModule;
+  }
+
+  createInstanceTreeNode(instance: VfModuleInstance, currentModel: VfModule, parentModel: VNFModel, modelName: string): VfModuleTreeNode | VfModuleTreeNode[] {
+    let numberOfChilds = Object.keys(instance).length;
+    if (numberOfChilds > 1) {
+      let result: VfModuleTreeNode[] = [];
+      for (let i = 0; i < numberOfChilds; i++) {
+        result.push(this.createNode(instance, currentModel, parentModel, modelName, i));
+      }
+      return result;
+    } else {
+      return this.createNode(instance, currentModel, parentModel, modelName, 0);
+    }
+  }
+
+  /***********************************************************
+   * return next level object (null because is last level)
+   ************************************************************/
+  getNextLevelObject(): any {
+    return null;
+  }
+
+  getTooltip = (): string => 'VFmodule';
+
+  getType = (): string => 'VFmodule';
+
+  /***********************************************************
+   * return if instance has missing data
+   * @param instance - vnf instance
+   * @param dynamicInputs
+   * @param isEcompGeneratedNaming
+   ************************************************************/
+  hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+    return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, []);
+  }
+
+
+  /***********************************************************
+   * return if instance has missing data
+   * @param node - VFModule node
+   * @param serviceModelId - current service id
+   ************************************************************/
+  onClickAdd(node: ITreeNode, serviceModelId: string): void {
+    const vnfStoreKey = this._sharedTreeService.getSelectedVNF() || this.getDefaultVNF(node.parent, serviceModelId);
+    if (vnfStoreKey) {
+      this._dialogService.addDialog(GenericFormPopupComponent, {
+        type: PopupType.VF_MODULE,
+        uuidData: <any>{
+          serviceId: serviceModelId,
+          modelName: node.data.name,
+          vFModuleStoreKey: null,
+          vnfStoreKey: vnfStoreKey,
+          modelId: node.data.modelId,
+          type: node.data.type,
+          popupService: this._vfModulePopupService
+        },
+        node: node,
+        isUpdateMode: false
+      });
+    } else {
+      let messageBoxData: MessageBoxData = new MessageBoxData(
+        "Select a parent",  // modal title
+        "There are multiple instances on the right side that can contain this vf-module Please select the VNF instance, to add this vf-module to, on the right side and then click the + sign",
+        <any>"warning",
+        <any>"md",
+        [
+          {text: "Close", size: "medium", closeModal: true}
+        ]);
+      MessageBoxService.openModal.next(messageBoxData);
+    }
+  }
+
+  getDefaultVNF(node: ITreeNode, serviceModelId: string): string {
+    let keys = _.keys(_.pickBy(this._store.getState().service.serviceInstance[serviceModelId].vnfs, vnf => {
+      return (vnf.originalName == node.data.name);
+    }));
+    return keys.length === 1 ? this._store.getState().service.serviceInstance[serviceModelId].vnfs[keys[0]].vnfStoreKey : null;
+  }
+
+  /***********************************************************
+   * return number of existing instances (in all VNF's)
+   * @param node - VfModule node
+   * @param serviceModelId - current service id
+   ************************************************************/
+  getNodeCount(node: ITreeNode, serviceModelId: string): number {
+    let count: number = 0;
+    if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
+      const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs;
+
+      for (let vnfKey in vnfs) {
+        count += this.countNumberOfVFModule(vnfs[vnfKey], node);
+      }
+      return count;
+    }
+    return count;
+  }
+
+
+  countNumberOfVFModule(vnf, node): number {
+    let count = 0;
+    for (let vfModuleKey in vnf['vfModules']) {
+      for (let vfModule in vnf['vfModules'][vfModuleKey]) {
+        if (vnf['vfModules'][vfModuleKey][vfModule]['modelInfo'].modelCustomizationId === node.data.modelUniqueId) {
+          const vfModuleObj = vnf['vfModules'][vfModuleKey][vfModule];
+          if (!(!_.isNil(vfModuleObj) && !_.isNil(vfModuleObj.action) && vfModuleObj.action.split('_').pop() === 'Delete')) count++;
+        }
+      }
+    }
+    return count;
+  }
+
+  getCountVFModuleOfSelectedVNF(node: ITreeNode, vnfStoreKey: string, serviceModelId: string): number {
+    let count: number = 0;
+    if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
+      const vnfs = this._store.getState().service.serviceInstance[serviceModelId].vnfs;
+
+      for (let vnfKey in vnfs) {
+        count += this.countNumberOfVFModule(vnfs[vnfKey], node);
+      }
+      return count;
+    }
+    return count;
+  }
+
+
+  /***********************************************************
+   * should show node icon
+   * @param node - current ITrees node
+   * @param serviceModelId - service id
+   ************************************************************/
+  showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+    const selectedVNF: string = this._sharedTreeService.getSelectedVNF();
+    if (selectedVNF) {
+      return this.showVFModuleOnSelectedVNF(node, selectedVNF, serviceModelId);
+    } else {
+      const optionalSelected = this.getOptionalVNFs(serviceModelId, node.parent.data.name);
+      if (optionalSelected.length === 1) {
+        return this.showVFModuleOnSelectedVNF(node, optionalSelected[0].vnfStoreKey, serviceModelId);
+      } else {
+        return new AvailableNodeIcons(false, false);
+      }
+    }
+  }
+
+
+  showVFModuleOnSelectedVNF(node: ITreeNode, selectedVNF: string, serviceModelId: string): AvailableNodeIcons {
+
+    if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF]) && node.parent.data.name === this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF].originalName) {
+      const existingVFModules = this.getCountVFModuleOfSelectedVNF(node, selectedVNF, serviceModelId);
+      const reachedLimit = this.isVFModuleReachedLimit(node, this._store.getState().service.serviceHierarchy, serviceModelId, existingVFModules);
+      const showAddIcon = this._sharedTreeService.shouldShowAddIcon()&& !reachedLimit;
+      return new AvailableNodeIcons(showAddIcon, reachedLimit);
+    }
+    return new AvailableNodeIcons(false, false);
+
+  }
+
+  getOptionalVNFs(serviceUUID: string, vnfOriginalModelName: string): any[] {
+    let result = [];
+    if (!_.isNil(this._store.getState().service.serviceInstance) && !_.isNil(this._store.getState().service.serviceInstance[serviceUUID])) {
+      const serviceVNFsInstances = this._store.getState().service.serviceInstance[serviceUUID].vnfs;
+      for (let vnfKey in serviceVNFsInstances) {
+        if (serviceVNFsInstances[vnfKey].originalName === vnfOriginalModelName) {
+          serviceVNFsInstances[vnfKey].vnfStoreKey = vnfKey;
+          result.push(serviceVNFsInstances[vnfKey]);
+        }
+      }
+    }
+    return result;
+  }
+
+
+  /************************************************
+   return number of instances with action Delete
+   @type: vnfs networks, vngGroups (only vfModule)
+   @node : node model from the left tree
+   ************************************************/
+  getExistingInstancesWithDeleteMode(node, serviceModelId: string, selectedVNF: string): number {
+    const existingInstances = this._store.getState().service.serviceInstance[serviceModelId].vnfs[selectedVNF].vfModules;
+    let counter = 0;
+    const modelUuid = node.data.uuid;
+
+    if (!_.isNil(existingInstances)) {
+      for (let instanceKey in existingInstances) {
+        let size = Object.keys(existingInstances[instanceKey]).length;
+        for (let i = 0; i < size; i++) {
+          let vfModuleDynamicKey = Object.keys(existingInstances[instanceKey])[i];
+          if (!_.isNil(existingInstances[instanceKey][vfModuleDynamicKey].action)) {
+            if (existingInstances[instanceKey][vfModuleDynamicKey]['uuid'] === modelUuid && existingInstances[instanceKey][vfModuleDynamicKey].action.split('_').pop() === 'Delete') {
+              counter++;
+            }
+          }
+        }
+
+      }
+    }
+    return counter;
+  }
+
+  isVFModuleReachedLimit(node: any, serviceHierarchy: any, serviceModelId: string, currentNodeCount: number): boolean {
+    let maxNodes: number = 1;
+    let vnfModules = serviceHierarchy[serviceModelId].vfModules;
+    if (vnfModules[node.data.name]) {
+      maxNodes = vnfModules[node.data.name].properties.maxCountInstances || 1;
+    }
+    return !(maxNodes > currentNodeCount);
+
+  }
+
+  getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
+    return {
+      edit: {
+        method: (node, serviceModelId) => {
+          this._iframeService.addClassOpenModal('content');
+          this._dialogService.addDialog(GenericFormPopupComponent, {
+            type: PopupType.VF_MODULE,
+            uuidData: <any>{
+              serviceId: serviceModelId,
+              modelName: node.data.modelName,
+              vFModuleStoreKey: node.data.dynamicModelName,
+              vnfStoreKey: node.parent.data.vnfStoreKey,
+              modelId: node.data.modelId,
+              type: node.data.type,
+              popupService: this._vfModulePopupService
+            },
+            node: node,
+            isUpdateMode: true
+          });
+        },
+        visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+        enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+      },
+      showAuditInfo: {
+        method: (node, serviceModelId) => {
+          let instance = this._store.getState().service.serviceInstance[serviceModelId].vnfs[node.parent.data.vnfStoreKey].vfModules[node.data.modelName][node.data.modelVersionId];
+          this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VFMODULE', this);
+        },
+        visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
+        enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
+      },
+      remove: {
+        method: (node, serviceModelId) => this._store.dispatch(removeVfModuleInstance(node.data.modelName, serviceModelId, node.parent.data.modelName, node.parent.data.vnfStoreKey, node.data.dynamicModelName)),
+        visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+        enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+      },
+      delete: {
+        method: (node, serviceModelId) => {
+          this._store.dispatch(deleteActionVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId))
+        },
+        visible: (node) => this._sharedTreeService.shouldShowDelete(node),
+        enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+      },
+      undoDelete: {
+        method: (node, serviceModelId) => {
+          this._store.dispatch(undoDeleteVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId))
+        },
+        visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
+        enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && this._sharedTreeService.shouldShowDelete(node.parent) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+      }
+    };
+
+
+  }
+
+  updatePosition(that , node, instanceId, parentStoreKey): void {
+    that.store.dispatch(updateVFModulePosition(node, instanceId, parentStoreKey));
+  }
+
+
+  getNodePosition(instance, deepDynamicName): number {
+    return (!_.isNil(instance) && !_.isNil(instance[deepDynamicName])) ? instance[deepDynamicName].position : null;
+  }
+
+  onSelectedNode(node: ITreeNode): void {
+  }
+
+  getInfoForVFModule(model, instance): ComponentInfoModel {
+    let modelInfoItems: ModelInformationItem[] = [];
+    if (model && !_.isNil(model.properties))
+    {
+      modelInfoItems = [
+        ModelInformationItem.createInstance("Base Module", model.properties.baseModule),
+        ModelInformationItem.createInstance("Min Instances", model.properties.minCountInstances),
+        ModelInformationItem.createInstance("Max Instances", model.properties.maxCountInstances),
+        ModelInformationItem.createInstance("Initial Instances Count", model.properties.initialCount)
+      ];
+    }
+    return this._componentInfoService.addGeneralInfoItems(modelInfoItems, ComponentInfoType.VFMODULE, model, instance);
+  }
+
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.spec.ts
new file mode 100644 (file)
index 0000000..10c8e39
--- /dev/null
@@ -0,0 +1,1671 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {VnfModelInfo} from "./vnf.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {VFModuleModelInfo} from "../vfModule/vfModule.model.info";
+import {VNFModel} from "../../../../../shared/models/vnfModel";
+import {SharedTreeService} from "../../shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {DuplicateService} from "../../../duplicate/duplicate.service";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {ServiceInfoService} from "../../../../../shared/server/serviceInfo/serviceInfo.service";
+import {AuditInfoModalComponent} from "../../../../../shared/components/auditInfoModal/auditInfoModal.component";
+import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
+import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model";
+import {ComponentInfoService} from "../../../component-info/component-info.service";
+import {AaiService} from "../../../../../shared/services/aaiService/aai.service";
+import {HttpClient, HttpHandler} from "@angular/common/http";
+import {FeatureFlagsService} from "../../../../../shared/services/featureFlag/feature-flags.service";
+
+describe('Vnf Model Info', () => {
+ let injector;
+ let httpMock: HttpTestingController;
+ let  _dynamicInputsService : DynamicInputsService;
+ let  _sharedTreeService : SharedTreeService;
+ let _serviceInfoService: ServiceInfoService;
+ let _defaultDataGeneratorService : DefaultDataGeneratorService;
+ let _dialogService : DialogService;
+ let _vfModulePopupService : VfModulePopuopService;
+ let _vnfPopupService : VnfPopupService;
+ let _duplicateService : DuplicateService;
+ let _iframeService : IframeService;
+ let _componentInfoService : ComponentInfoService;
+
+  let _store : NgRedux<AppState>;
+  let vnfModel: VnfModelInfo;
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, NgReduxTestingModule],
+      providers: [
+        MockNgRedux,
+        DynamicInputsService,
+        DialogService,
+        VfModulePopuopService,
+        VnfPopupService,
+        DefaultDataGeneratorService,
+        SharedTreeService,
+        DuplicateService,
+        AaiService,
+        HttpClient,
+        HttpHandler,
+        FeatureFlagsService,
+        ComponentInfoService,
+        IframeService]
+    }).compileComponents();
+
+    injector = getTestBed();
+    _sharedTreeService = injector.get(SharedTreeService);
+    _store = injector.get(NgRedux);
+    _componentInfoService = injector.get(ComponentInfoService);
+
+    vnfModel = new VnfModelInfo(
+      _dynamicInputsService,
+      _sharedTreeService,
+      _defaultDataGeneratorService,
+      _dialogService,
+      _vnfPopupService,
+      _vfModulePopupService,
+      _duplicateService,
+      null,
+      _iframeService,
+      _componentInfoService,
+      _store);
+
+
+  });
+
+  test('VnfModelInfo should be defined', () => {
+    expect(VnfModelInfo).toBeDefined();
+  });
+
+  test('VnfModelInfo should defined extra details', () => {
+    expect(vnfModel.name).toEqual('vnfs');
+    expect(vnfModel.type).toEqual('VNF');
+    expect(vnfModel.childName).toEqual('vfModules');
+    expect(vnfModel.childType).toEqual('VFModuleModelInfo');
+  });
+
+  test('isEcompGeneratedNaming should return true if isEcompGeneratedNaming is "true" ', () => {
+    let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming(<any>{
+      properties: {
+        ecomp_generated_naming: 'true'
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeTruthy();
+  });
+
+  test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is "false"', () => {
+    let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming({
+      properties: {
+        ecomp_generated_naming: 'false'
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeFalsy();
+  });
+
+  test('isEcompGeneratedNaming should return false if isEcompGeneratedNaming is not defined', () => {
+    let isEcompGeneratedNaming: boolean = vnfModel.isEcompGeneratedNaming({
+      properties: {
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeFalsy();
+  });
+
+
+  test('getTooltip should return "VF"', () => {
+    let tooltip: string = vnfModel.getTooltip();
+    expect(tooltip).toEqual('VF');
+  });
+
+  test('getType should return "VF"', () => {
+    let tooltip: string = vnfModel.getType();
+    expect(tooltip).toEqual('VF');
+  });
+
+  test('getNextLevelObject should vfModule level object', () => {
+    let nextLevel: VFModuleModelInfo = vnfModel.getNextLevelObject();
+    expect(nextLevel.type).toEqual('Module');
+  });
+
+  test('getModel should return VNF model', () => {
+    let model: VNFModel = vnfModel.getModel('2017-388_ADIOD-vPE 1', <any>{
+      originalName : '2017-388_ADIOD-vPE 1'
+    }, getServiceHierarchy());
+    expect(model.type).toEqual('VF');
+  });
+
+  test('showNodeIcons should return false if reachLimit of max', ()=>{
+    let serviceId : string = 'servicedId';
+    let node = {
+      data : {
+        id : 'vnfId',
+        name : 'vnfName',
+        modelCustomizationId : "modelCustomizationId",
+        modelUniqueId: "modelCustomizationId"
+      }
+    };
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global:{},
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'vnfs' : {
+              modelCustomizationId : "modelCustomizationId",
+              'modelInfo': {
+                modelCustomizationId : "modelCustomizationId"
+              },
+              'vnfName' : {
+                'properties' : {
+                  'max_instances' : 1
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingVNFCounterMap' : {
+              'modelCustomizationId' : 1
+            },
+            'vnfs' : {
+              'vnfName' :{
+
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let result = vnfModel.showNodeIcons(<any>node, serviceId);
+    expect(result).toEqual(new AvailableNodeIcons(false , true));
+  });
+
+  test('showNodeIcons should return true if not reachLimit of max', ()=>{
+    let serviceId : string = 'servicedId';
+    let node = {
+      data : {
+        id : 'vnfId',
+        name : 'vnfName'
+      }
+    };
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global:{
+        drawingBoardStatus: "EDIT"
+      },
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'vnfs' : {
+              'vnfName' : {
+                'properties' : {
+                  'max_instances' : 2
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingVNFCounterMap' : {
+              'vnfId' : 1
+            },
+            'vnfs' : {
+              'vnfName' :{
+
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let result = vnfModel.showNodeIcons(<any>node, serviceId);
+    expect(result).toEqual(new AvailableNodeIcons(true , false));
+  });
+
+  test('getNodeCount should return number of nodes', ()=>{
+    let serviceId : string = 'servicedId';
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global : {},
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'vnfs' : {
+              'vnfName' : {
+                'properties' : {
+                  'max_instances' : 1
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingVNFCounterMap' : {
+              'modelCustomizationId' : 1
+            },
+            'vnfs' : {
+              'vnfName' :{
+                'originalName' : 'vnfName'
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let node = {
+      data : {
+        id : 'vnfId',
+        name : 'vnfName',
+        modelCustomizationId : "modelCustomizationId",
+        modelUniqueId:  "modelCustomizationId"
+      }
+    };
+    let result = vnfModel.getNodeCount(<any>node , serviceId);
+    expect(result).toEqual(1);
+
+    node.data.modelCustomizationId = 'vnfId_notExist';
+    node.data.modelUniqueId = 'vnfId_notExist';
+    result = vnfModel.getNodeCount(<any>node , serviceId);
+    expect(result).toEqual(0);
+
+    result = vnfModel.getNodeCount(<any>node , serviceId + '_notExist');
+    expect(result).toEqual(0);
+  });
+
+  test('getMenuAction: edit', ()=>{
+    let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"};
+    let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+    let result = vnfModel.getMenuAction(<any>node, serviceModelId);
+    spyOn(result['edit'], 'method');
+    expect(result['edit']).toBeDefined();
+    expect(result['edit'].visible).toBeTruthy();
+    expect(result['edit'].enable).toBeTruthy();
+    result['edit']['method'](node, serviceModelId);
+    expect(result['edit']['method']).toHaveBeenCalledWith(node, serviceModelId);
+  });
+
+  test('member should defined edit method', () => {
+    let node = {
+      data : {
+        "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+        "missingData": true,
+        "action": "None",
+        "inMaint": true,
+        "name": "jlfBwIks283yKlCD8",
+        "modelName": "VF_vMee 0",
+        "type": "VF",
+        "userProvidedNaming": false,
+        "networkStoreKey": "VF_vMee 0:004",
+        "vnfStoreKey": "VF_vMee 0:004",
+        "typeName": "VNF"
+      },
+      type : 'VNF'
+
+    };
+    let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+
+    let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
+    spyOn(menuActions['edit'], 'method');
+    expect(menuActions['edit']).toBeDefined();
+    expect(menuActions['edit'].visible(node)).toBeFalsy();
+    menuActions['edit']['method'](node, serviceModelId);
+    expect(menuActions['edit']['method']).toHaveBeenCalledWith(node, serviceModelId);
+  });
+
+  test('getMenuAction: duplicate', ()=>{
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      "global": {
+      "name": null,
+        "type": "UPDATE_DRAWING_BOARD_STATUS",
+        "drawingBoardStatus": "CREATE"
+      }
+    });
+    let node = {
+      data : {
+        "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+        "missingData": true,
+        "action": "None",
+        "inMaint": true,
+        "name": "jlfBwIks283yKlCD8",
+        "modelName": "VF_vMee 0",
+        "type": "VF",
+        "isEcompGeneratedNaming":true,
+        "networkStoreKey": "VF_vMee 0:004",
+        "vnfStoreKey": "VF_vMee 0:004",
+        "typeName": "VNF"
+      },
+      type : 'VNF'
+
+    };
+    let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+    let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
+    spyOn(menuActions['duplicate'], 'method');
+    expect(menuActions['duplicate']).toBeDefined();
+    expect(menuActions['duplicate'].visible(node)).toBeFalsy();
+    menuActions['duplicate']['method'](node, serviceModelId);
+    expect(menuActions['duplicate']['method']).toHaveBeenCalledWith(node, serviceModelId);
+  });
+
+  test('getMenuAction: remove', ()=>{
+    let node = {
+      data : {
+        "modelId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+        "missingData": true,
+        "action": "None",
+        "inMaint": true,
+        "name": "jlfBwIks283yKlCD8",
+        "modelName": "VF_vMee 0",
+        "type": "VF",
+        "isEcompGeneratedNaming":true,
+        "networkStoreKey": "VF_vMee 0:004",
+        "vnfStoreKey": "VF_vMee 0:004",
+        "typeName": "VNF"
+      },
+      type : 'VNF'
+
+    };
+    let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+
+    let menuActions = vnfModel.getMenuAction(<any>node, serviceModelId);
+    spyOn(menuActions['remove'], 'method');
+    expect(menuActions['remove']).toBeDefined();
+    expect(menuActions['remove'].visible(node)).toBeFalsy();
+    menuActions['remove']['method'](node, serviceModelId);
+    expect(menuActions['remove']['method']).toHaveBeenCalledWith(node, serviceModelId);
+  });
+
+  test('getMenuAction: delete', ()=>{
+    let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"};
+    let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+    let result = vnfModel.getMenuAction(<any>node, serviceModelId);
+    spyOn(result['delete'], 'method');
+    expect(result['delete']).toBeDefined();
+    expect(result['delete'].visible).toBeTruthy();
+    expect(result['delete'].enable).toBeTruthy();
+    result['delete']['method'](node, serviceModelId);
+    expect(result['delete']['method']).toHaveBeenCalledWith(node, serviceModelId);
+  });
+
+
+  test('getMenuAction: undoDelete', ()=>{
+    let node = {"modelId":"d6557200-ecf2-4641-8094-5393ae3aae60","missingData":true,"action":"None","inMaint":true,"name":"jlfBwIks283yKlCD8","modelName":"VF_vMee 0","type":"VF","isEcompGeneratedNaming":true,"networkStoreKey":"VF_vMee 0:004","vnfStoreKey":"VF_vMee 0:004","typeName":"VNF"};
+    let serviceModelId = "d6557200-ecf2-4641-8094-5393ae3aae60";
+    let result = vnfModel.getMenuAction(<any>node, serviceModelId);
+    spyOn(result['undoDelete'], 'method');
+    expect(result['undoDelete']).toBeDefined();
+    expect(result['undoDelete'].visible).toBeDefined();
+    expect(result['undoDelete'].enable).toBeDefined();
+    result['undoDelete']['method'](node, serviceModelId);
+    expect(result['undoDelete']['method']).toHaveBeenCalledWith(node, serviceModelId);
+  });
+
+  test('getMenuAction: showAuditInfo', ()=>{
+    jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
+
+    jest.spyOn(AuditInfoModalComponent.openInstanceAuditInfoModal, 'next');
+    let node = {
+      data : {
+        "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "action": "Create",
+        "type": "VF",
+        "vnfStoreKey": "MSOTEST103a",
+        "typeName": "VNF",
+        "isFailed": true,
+      },
+      type : 'VNF'
+
+    };
+    let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
+    let result = vnfModel.getMenuAction(<any>node, serviceModelId);
+    spyOn(result['showAuditInfo'], 'method');
+    expect(result['showAuditInfo']).toBeDefined();
+    expect(result['showAuditInfo'].visible(node)).toBeTruthy();
+    expect(result['showAuditInfo'].enable(node)).toBeTruthy();
+    result['showAuditInfo']['method'](node, serviceModelId);
+
+    // expect(AuditInfoModalComponent.openInstanceAuditInfoModal.next).toBeCalled();
+    // expect(result['showAuditInfo'].method)
+
+  });
+
+  test('Info for vnf should be correct', () => {
+    const model = getVNFModel();
+    const instance = getVNFInstance();
+    let actualVNFInfo = vnfModel.getInfoForVnf(model,instance);
+    let expectedVNFInfo = [
+      ModelInformationItem.createInstance('Type', 'VF'),
+      ModelInformationItem.createInstance('Model Version', '2.0'),
+      ModelInformationItem.createInstance('Model Customization ID','91415b44-753d-494c-926a-456a9172bbb9'),
+      ModelInformationItem.createInstance('Instance ID', '66cbb3b5-c823-470c-9520-4e0b85112250'),
+      ModelInformationItem.createInstance('In Maintenance', true),
+      ModelInformationItem.createInstance('Min Instances', 0),
+      ModelInformationItem.createInstance('Max Instances',1)
+    ];
+    expect(actualVNFInfo).toEqual(new ComponentInfoModel(ComponentInfoType.VNF, expectedVNFInfo, []));
+  });
+
+  test('Info for vnf in left side - model only - should be correct', () => {
+    const model = getVNFModel();
+    let actualVNFInfo = vnfModel.getInfoForVnf(model,null);
+    let expectedVNFInfo = [
+      ModelInformationItem.createInstance('Type', 'VF'),
+      ModelInformationItem.createInstance('Model Version', '2.0'),
+      ModelInformationItem.createInstance('Model Customization ID','91415b44-753d-494c-926a-456a9172bbb9'),
+      ModelInformationItem.createInstance('Min Instances', 0),
+      ModelInformationItem.createInstance('Max Instances',1)
+    ];
+    expect(actualVNFInfo).toEqual(new ComponentInfoModel(ComponentInfoType.VNF, expectedVNFInfo, []));
+  });
+
+  function getVNFModel(){
+    return {
+      "name":"VF_vMee",
+      "version":"2.0",
+      "description":"VSP_vMee",
+      "uuid":"d6557200-ecf2-4641-8094-5393ae3aae60",
+      "invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e",
+      "max":1,
+      "min":0,
+      "customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9",
+      "isEcompGeneratedNaming":true,
+      "type":"VF",
+      "modelCustomizationName":"VF_vMee 0",
+      "vfcInstanceGroups":{},
+      "properties":{
+        "gpb2_Internal2_mac":"00:11:22:EF:AC:DF",
+        "sctp-a-ipv6-egress_rule_application":"any",
+        "sctp-b-ipv6-egress_src_start_port":"0",
+        "Internal2_allow_transit":"true",
+        "sctp-b-IPv6_ethertype":"IPv6",
+        "ncb2_Internal1_mac":"00:11:22:EF:AC:DF",
+        "sctp-b-ingress_rule_protocol":"icmp","sctp-b-ingress_action":"pass",
+        "sctp-a-egress_rule_application":"any",
+        "sctp-b-ipv6-ingress-src_start_port":"0.0",
+        "ncb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_src_addresses":"local",
+        "fsb_volume_size_0":"320.0",
+        "sctp-a-ipv6-ingress-dst_start_port":"0",
+        "sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress_rule_application":"any",
+        "domain_name":"default-domain",
+        "sctp-a-egress_src_addresses":"local",
+        "sctp-b-egress-src_start_port":"0.0",
+        "sctp-a-ingress_rule_protocol":"icmp",
+        "sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group",
+        "sctp-b-ipv6-ingress-dst_end_port":"65535",
+        "sctp-a-ingress_ethertype":"IPv4",
+        "sctp-a-egress-src_start_port":"0.0",
+        "sctp-b-dst_subnet_prefix_v6":"::",
+        "nf_naming":"{ecomp_generated_naming=true}",
+        "sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0"
+        }
+    };
+
+  }
+
+  function getVNFInstance(){
+    return {
+      "action":"None",
+      "instanceName":"4O61SmpFAdCm1oVEs",
+      "instanceId":"66cbb3b5-c823-470c-9520-4e0b85112250",
+      "orchStatus":null,
+      "productFamilyId":null,
+      "lcpCloudRegionId":null,
+      "tenantId":null,
+      "modelInfo":{
+        "modelCustomizationName":"VF_vMee 0",
+        "modelInvariantId":"vnf-instance-model-invariant-id",
+        "modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60",
+        "modelType":"vnf"
+      },
+      "instanceType":"7538ifdSoTccmbEkr",
+      "provStatus":null,
+      "inMaint":true,
+      "uuid":"d6557200-ecf2-4641-8094-5393ae3aae60",
+      "originalName":"VF_vMee 0",
+      "legacyRegion":null,
+      "lineOfBusiness":null,
+      "platformName":null,
+      "trackById":"VF_vMee 0:004",
+      "vfModules":{
+        "vf_vmee0..VfVmee..vmme_vlc..module-1":{
+          "vf_vmee0..VfVmee..vmme_vlc..module-1:008":{
+            "action":"None",
+            "instanceName":"ss820f_0918_db",
+            "instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280",
+            "orchStatus":"deleted",
+            "productFamilyId":null,
+            "lcpCloudRegionId":null,
+            "tenantId":null,
+            "modelInfo":{
+              "modelCustomizationName":"VfVmee..vmme_vlc..module-1",
+              "modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9",
+              "modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750",
+              "modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
+              "modelType":"vfModule"
+            },
+            "instanceType":null,
+            "provStatus":null,
+            "inMaint":true,
+            "uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830",
+            "originalName":"VfVmee..vmme_vlc..module-1",
+            "legacyRegion":null,
+            "lineOfBusiness":null,
+            "platformName":null,
+            "trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008",
+            "isBase":false,
+            "volumeGroupName":null
+          }
+        },
+        "dc229cd8-c132-4455-8517-5c1787c18b14":{
+          "dc229cd8-c132-4455-8517-5c1787c18b14:009":{
+            "action":"None",
+            "instanceName":"ss820f_0918_base",
+            "instanceId":"3ef042c4-259f-45e0-9aba-0989bd8d1cc5",
+            "orchStatus":"Assigned",
+            "productFamilyId":null,
+            "lcpCloudRegionId":null,
+            "tenantId":null,
+            "modelInfo":{
+              "modelCustomizationId":"8ad8670b-0541-4499-8101-275bbd0e8b6a",
+              "modelInvariantId":"1e463c9c-404d-4056-ba56-28fd102608de",
+              "modelVersionId":"dc229cd8-c132-4455-8517-5c1787c18b14",
+              "modelType":"vfModule"
+            },
+            "instanceType":null,
+            "provStatus":null,
+            "inMaint":false,
+            "uuid":"dc229cd8-c132-4455-8517-5c1787c18b14",
+            "originalName":null,
+            "legacyRegion":null,
+            "lineOfBusiness":null,
+            "platformName":null,
+            "trackById":"dc229cd8-c132-4455-8517-5c1787c18b14:009",
+            "isBase":true,
+            "volumeGroupName":null
+          }
+        }
+      },
+      "networks":{
+
+      }
+    };
+  }
+
+  function getServiceHierarchy(){
+    return {
+      "service": {
+        "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "name": "action-data",
+        "version": "1.0",
+        "toscaModelURL": null,
+        "category": "",
+        "serviceType": "",
+        "serviceRole": "",
+        "description": "",
+        "serviceEcompNaming": "false",
+        "instantiationType": "Macro",
+        "inputs": {
+          "2017488_adiodvpe0_ASN": {
+            "type": "string",
+            "description": "AV/PE",
+            "entry_schema": null,
+            "inputProperties": null,
+            "constraints": [],
+            "required": true,
+            "default": "AV_vPE"
+          }
+        },
+        "vidNotions": {
+          "instantiationUI": "legacy",
+          "modelCategory": "other"
+        }
+      },
+      "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,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "max_instances": "3",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              },
+              "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",
+                "baseModule": true
+              },
+              "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              }
+            },
+            "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",
+                "baseModule": false
+              },
+              "inputs": {}
+            }
+          },
+          "vfcInstanceGroups": {}
+        }
+      },
+      "networks": {},
+      "collectionResource": {},
+      "configurations": {},
+      "fabricConfigurations": {},
+      "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          },
+          "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",
+            "baseModule": true
+          },
+          "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",
+            "baseModule": false
+          },
+          "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          }
+        },
+        "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",
+            "baseModule": false
+          },
+          "inputs": {}
+        }
+      },
+      "pnfs": {}
+    }
+  }
+
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnf/vnf.model.info.ts
new file mode 100644 (file)
index 0000000..cec3fad
--- /dev/null
@@ -0,0 +1,332 @@
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {ILevelNodeInfo} from "../basic.model.info";
+import {VFModuleModelInfo} from "../vfModule/vfModule.model.info";
+import {VNFModel} from "../../../../../shared/models/vnfModel";
+import {VnfInstance} from "../../../../../shared/models/vnfInstance";
+import {VnfTreeNode} from "../../../../../shared/models/vnfTreeNode";
+import {InputType} from "../../../../../shared/models/inputTypes";
+import {SharedTreeService} from "../../shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../../shared/store/reducers";
+import {DefaultDataGeneratorService} from "../../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {
+  GenericFormPopupComponent,
+  PopupType
+} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {DialogService} from 'ng2-bootstrap-modal';
+import {VnfPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {VfModulePopuopService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {DuplicateService} from "../../../duplicate/duplicate.service";
+import {DuplicateVnfComponent} from "../../../duplicate/duplicate-vnf.component";
+import {SdcUiServices} from "onap-ui-angular";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
+import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
+import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
+import {ServiceInstanceActions} from "../../../../../shared/models/serviceInstanceActions";
+import {
+  deleteActionVnfInstance,
+  undoDeleteActionVnfInstance,
+  updateVnfPosition
+} from "../../../../../shared/storeUtil/utils/vnf/vnf.actions";
+import * as _ from 'lodash';
+import {IModalConfig} from "onap-ui-angular/dist/modals/models/modal-config";
+import {ComponentInfoModel, ComponentInfoType} from "../../../component-info/component-info-model";
+import {ComponentInfoService} from "../../../component-info/component-info.service";
+import {ModelInformationItem} from "../../../../../shared/components/model-information/model-information.component";
+
+export class VnfModelInfo implements ILevelNodeInfo {
+  constructor(private _dynamicInputsService: DynamicInputsService,
+              private _sharedTreeService: SharedTreeService,
+              private _defaultDataGeneratorService: DefaultDataGeneratorService,
+              private _dialogService: DialogService,
+              private _vnfPopupService: VnfPopupService,
+              private _vfModulePopupService: VfModulePopuopService,
+              private _duplicateService: DuplicateService,
+              private modalService: SdcUiServices.ModalService,
+              private _iframeService: IframeService,
+              private _componentInfoService: ComponentInfoService,
+              private _store: NgRedux<AppState>) {
+  }
+
+  name: string = 'vnfs';
+  type: string = 'VNF';
+  childName: string = 'vfModules';
+  childType: string = 'VFModuleModelInfo';
+  typeName: string = 'VNF';
+
+  /***********************************************************
+   * return if user should provide instance name or not.
+   * @param currentModel - current Model object
+   ************************************************************/
+  isEcompGeneratedNaming = (currentModel): boolean => {
+    const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
+    return ecompGeneratedNaming === "true";
+  };
+
+  /***********************************************************
+   * return model dynamic inputs
+   * @param currentModel - current Model object
+   ************************************************************/
+  updateDynamicInputsDataFromModel = (currentModel): any => {
+    let displayInputs;
+    return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
+  };
+
+  /***********************************************************
+   * return vnf model
+   * @param vnfModelId - current Model id
+   * @param instance - vnf instance
+   * @param serviceHierarchy - serviceHierarchy
+   ************************************************************/
+  getModel = (vnfModelId: string, instance: VnfInstance, serviceHierarchy): VNFModel => {
+    const originalModelName = instance.originalName ? instance.originalName : vnfModelId;
+    return new VNFModel(serviceHierarchy[this.name][originalModelName]);
+  };
+
+
+  /***********************************************************
+   * return vnf instance tree node
+   * @param instance - vnf instance
+   * @param model - vnf model
+   * @param parentModel
+   * @param storeKey - store key if exist
+   ************************************************************/
+  createInstanceTreeNode = (instance: VnfInstance, model: VNFModel, parentModel, storeKey: string): VnfTreeNode => {
+    let node = new VnfTreeNode(instance, model, storeKey);
+    node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
+    node.typeName = this.typeName;
+    node.menuActions = this.getMenuAction(<any>node, model.uuid);
+    node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
+    node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+    node = this._sharedTreeService.addingStatusProperty(node);
+    return node;
+  };
+
+  /***********************************************************
+   * return next level object (VFModule)
+   ************************************************************/
+  getNextLevelObject = (): VFModuleModelInfo => {
+    return new VFModuleModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._vfModulePopupService, this._iframeService, this._store, this._componentInfoService);
+  };
+
+  /***********************************************************
+   * return if instance has missing data
+   * @param instance - vnf instance
+   * @param dynamicInputs
+   * @param isEcompGeneratedNaming
+   ************************************************************/
+  hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+    return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM]);
+  }
+
+  getTooltip = (): string => 'VF';
+
+  getType = (): string => 'VF';
+
+  /***********************************************************
+   * return if instance has missing data
+   * @param node - VNF node
+   * @param serviceModelId - current service id
+   ************************************************************/
+  onClickAdd(node, serviceModelId: string): void {
+    this._dialogService.addDialog(GenericFormPopupComponent, {
+      type: PopupType.VNF,
+      uuidData: <any>{
+        serviceId: serviceModelId,
+        modelName: node.data.name,
+        vnfStoreKey: null,
+        modelId: node.data.modelVersionId,
+        type: node.data.type,
+        popupService: this._vnfPopupService
+      },
+      node: node,
+      isUpdateMode: false
+    })
+  }
+
+  /***********************************************************
+   * return number of existing instances
+   * @param node - VNF node
+   * @param serviceModelId - current service id
+   ************************************************************/
+  getNodeCount(node: ITreeNode, serviceModelId: string): number {
+    let map = null;
+    if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
+      map = this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap || 0;
+
+      if (!_.isNil(map)) {
+        let count = map[node.data.modelUniqueId] || 0;
+        count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
+        return count;
+      }
+    }
+    return 0;
+  }
+
+  /***********************************************************
+   * should show node icon
+   * @param node - current ITrees node
+   * @param serviceModelId - service id
+   ************************************************************/
+  showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+    let counter: number = !_.isNil(this._store.getState().service.serviceInstance[serviceModelId]) ?
+      (this._store.getState().service.serviceInstance[serviceModelId].existingVNFCounterMap[node.data.modelUniqueId] || 0) : 0;
+    counter -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfs');
+
+    const properties = this._store.getState().service.serviceHierarchy[serviceModelId].vnfs[node.data.name].properties;
+    const maxInstances: number = !_.isNil(properties) ? (properties.max_instances || 1) : 1;
+    const isReachedLimit = !(maxInstances > counter);
+    const showAddIcon = this._sharedTreeService.shouldShowAddIcon() && !isReachedLimit;
+    return new AvailableNodeIcons(showAddIcon, isReachedLimit)
+  }
+
+  getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
+    return <any>{
+      edit: {
+        method: (node, serviceModelId) => {
+          this._iframeService.addClassOpenModal('content');
+          this._dialogService.addDialog(GenericFormPopupComponent, {
+            type: PopupType.VNF,
+            uuidData: <any>{
+              serviceId: serviceModelId,
+              modelName: node.data.modelName,
+              vnfStoreKey: node.data.vnfStoreKey,
+              modelId: node.data.modelId,
+              type: node.data.type,
+              popupService: this._vnfPopupService
+            },
+            node: node,
+            isUpdateMode: true
+          });
+        },
+        visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+        enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+      },
+      showAuditInfo: {
+        method: (node, serviceModelId) => {
+            const instance = this._store.getState().service.serviceInstance[serviceModelId].vnfs[node.data.vnfStoreKey];
+            this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VNF', this);
+          },
+        visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
+        enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
+      },
+      duplicate: {
+        method: (node, serviceModelId) => {
+          if (this._store.getState().global.flags['FLAG_DUPLICATE_VNF']) {
+            const storeKey = node.data.vnfStoreKey;
+            let modalConfig: IModalConfig = this._duplicateService.openDuplicateModal(serviceModelId, node.data.modelUniqueId, node.data.modelName, storeKey, 1, this._store, node);
+            this.modalService.openCustomModal(modalConfig, DuplicateVnfComponent);
+          }
+        },
+        visible: (node) => this._sharedTreeService.shouldShowDuplicate(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create && this._duplicateService.canDuplicate(node),
+        enable: (node, serviceModelId) => this._duplicateService.isEnabled(node, this._store, serviceModelId)
+      },
+      remove: {
+        method: (node, serviceModelId) => {
+          if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+            let storeKey: string = node.data.vnfStoreKey;
+            this._store.dispatch(removeInstance(node.data.vnfStoreKey, serviceModelId, storeKey, node));
+            this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
+            this._sharedTreeService.selectedVNF = null;
+          } 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?",
+              <any>"warning",
+              <any>"md",
+              [
+                {
+                  text: "Remove VNF",
+                  size: "large",
+                  callback: this.removeVnf.bind(this, node, serviceModelId),
+                  closeModal: true
+                },
+                {text: "Don’t Remove", size: "medium", closeModal: true}
+              ]);
+
+            MessageBoxService.openModal.next(messageBoxData);
+          }
+        },
+        visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+        enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+      },
+      delete: {
+        method: (node, serviceModelId) => {
+          if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+            this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
+          } else {
+            this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId) => {
+              this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
+                this._store.dispatch(deleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
+              });
+            });
+          }
+        },
+        visible: (node) => this._sharedTreeService.shouldShowDelete(node),
+        enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+      },
+      undoDelete: {
+        method: (node, serviceModelId) => {
+          if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+            this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
+          } else {
+            this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
+              this._store.dispatch(undoDeleteActionVnfInstance(node.data.vnfStoreKey, serviceModelId));
+            });
+          }
+        },
+        visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
+        enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+      }
+    }
+  }
+
+  removeVnf(this, node, serviceModelId) {
+    this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.vnfStoreKey, node));
+    this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
+    this._sharedTreeService.selectedVNF = null;
+  }
+
+  /***********************************************************
+   * should update node position inside the tree
+   * @param node - current ITrees node
+   ************************************************************/
+  updatePosition(that, node, instanceId): void {
+    that.store.dispatch(updateVnfPosition(node, instanceId, node.vnfStoreKey));
+  }
+
+  /***********************************************************
+   * return the position of the current node in the tree
+   * @param instance - current ITrees node instance
+   ************************************************************/
+  getNodePosition(instance): number {
+    return !_.isNil(instance) ? instance.position : null;
+  }
+
+  /***********************************************************
+   * When user is click on some nod element
+   * @param node - current ITrees node
+   ************************************************************/
+  onSelectedNode(node: ITreeNode): void {
+    ComponentInfoService.triggerComponentInfoChange.next(new ComponentInfoModel(ComponentInfoType.VNF,[], []));
+  }
+
+  getInfoForVnf(model, instance): ComponentInfoModel {
+    let modelInfoItems: ModelInformationItem[] = [];
+    if (model) {
+      modelInfoItems.push(ModelInformationItem.createInstance("Min Instances",  model.min));
+      modelInfoItems.push(ModelInformationItem.createInstance("Max Instances",  model.max));
+    }
+    if (instance) {
+      modelInfoItems.push(ModelInformationItem.createInstance("NF Type", instance.nfType));
+      modelInfoItems.push(ModelInformationItem.createInstance("NF Role",  instance.nfRole));
+    }
+    return this._componentInfoService.addGeneralInfoItems(modelInfoItems, ComponentInfoType.VNF, model, instance);
+
+  }
+
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.spec.ts
new file mode 100644 (file)
index 0000000..532a8fe
--- /dev/null
@@ -0,0 +1,291 @@
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {VnfGroupingModelInfo} from "./vnfGrouping.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {SharedTreeService} from "../../shared.tree.service";
+import {VnfGroupPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {VnfGroupModel} from "../../../../../shared/models/vnfGroupModel";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {ActivatedRoute} from "@angular/router";
+import {RouterTestingModule} from "@angular/router/testing";
+import {DrawingBoardModes} from "../../../drawing-board.modes";
+
+describe('VnfGroupingModelInfo Model Info', () => {
+  let injector;
+  let _dialogService : DialogService;
+  let _vnfGroupPopupService : VnfGroupPopupService;
+  let  _dynamicInputsService : DynamicInputsService;
+  let _sharedTreeService : SharedTreeService;
+  let _iframeService : IframeService;
+  let vnfGroupModel: VnfGroupingModelInfo;
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, NgReduxTestingModule, RouterTestingModule],
+      providers: [
+        DialogService,
+        VnfGroupPopupService,
+        DynamicInputsService,
+        SharedTreeService,
+        IframeService,
+        MockNgRedux]
+    });
+    await TestBed.compileComponents();
+    injector = getTestBed();
+    _sharedTreeService = injector.get(SharedTreeService);
+
+    vnfGroupModel =  new VnfGroupingModelInfo(_dynamicInputsService, _sharedTreeService, _dialogService, _vnfGroupPopupService, _iframeService,  MockNgRedux.getInstance());
+  })().then(done).catch(done.fail));
+
+
+  test('VnfGroupingModelInfo should be defined', () => {
+    expect(vnfGroupModel).toBeDefined();
+  });
+
+  test('VnfGroupingModelInfo should defined extra details', () => {
+    expect(vnfGroupModel.name).toEqual('vnfGroups');
+    expect(vnfGroupModel.type).toEqual('VnfGroup');
+  });
+
+  test('isEcompGeneratedNaming should return true if vnf group has isEcompGeneratedNaming is "true" ', () => {
+    let isEcompGeneratedNaming : boolean = vnfGroupModel.isEcompGeneratedNaming({
+      properties: {
+        ecomp_generated_naming: 'true'
+      }
+    });
+    expect(isEcompGeneratedNaming).toBeTruthy();
+  });
+
+
+  test('getTooltip should return "vnfGrouping"', () => {
+    let tooltip: string = vnfGroupModel.getTooltip();
+    expect(tooltip).toEqual('VnfGroup');
+  });
+
+  test('getType should return "vnfGrouping"', () => {
+    let tooltip: string = vnfGroupModel.getType();
+    expect(tooltip).toEqual('VnfGroup');
+  });
+
+  test('getNextLevelObject should return null', () => {
+    let nextLevel = vnfGroupModel.getNextLevelObject();
+    expect(nextLevel).not.toBeNull();
+  });
+
+
+  test('showNodeIcons should return true if not reachLimit of max', ()=>{
+    let serviceId : string = 'servicedId';
+    let node = {
+      data : {
+        id : 'vnfGroupId',
+        name : 'vnfGroupName'
+      }
+    };
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+        global:{
+          drawingBoardStatus: "EDIT"
+        },
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'vnfGroups' : {
+              'vnfGroupName' : {
+                'properties' : {
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingVnfGroupCounterMap' : {
+              'vnfGroupId' : 1
+            },
+            'vnfGroups' : {
+              'vnfGroupName' :{
+
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let result = vnfGroupModel.showNodeIcons(<any>node, serviceId);
+    expect(result).toEqual(new AvailableNodeIcons(true , false));
+  });
+
+  test('getNodeCount should return number of nodes', ()=>{
+    let serviceId : string = 'servicedId';
+    jest.spyOn(_sharedTreeService, 'getExistingInstancesWithDeleteMode').mockReturnValue(0);
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global : {},
+      service : {
+        serviceHierarchy : {
+          'servicedId' : {
+            'vnfGroups' : {
+              'vnfGroupName' : {
+                'properties' : {
+                }
+              }
+            }
+          }
+        },
+        serviceInstance : {
+          'servicedId' : {
+            'existingVnfGroupCounterMap' : {
+              'vnfGroupId' : 1
+            },
+            'vnfGroups' : {
+              'vnfGroupName' :{
+                'originalName' : 'vnfGroupName'
+              }
+            }
+          }
+        }
+      }
+    });
+
+    let node = {
+      data : {
+        id : 'vnfGroupId',
+        name : 'vnfGroupName',
+        modelUniqueId: 'vnfGroupId',
+      }
+    };
+    let result = vnfGroupModel.getNodeCount(<any>node , serviceId);
+    expect(result).toEqual(1);
+
+    node.data.modelUniqueId = 'vnfGroupId_notExist';
+    result = vnfGroupModel.getNodeCount(<any>node , serviceId);
+    expect(result).toEqual(0);
+
+    result = vnfGroupModel.getNodeCount(<any>node , serviceId + '_notExist');
+    expect(result).toEqual(0);
+  });
+
+  test('getModel should return VnfGroup model', () => {
+    let model: VnfGroupModel = vnfGroupModel.getModel('ResourceGroup0', <any>{
+      originalName : 'ResourceGroup0'
+    }, getServiceHierarchy());
+    expect(model.type).toEqual('VnfGroup');
+  });
+
+  test('getMenuAction: showAuditInfoVnfGroup', ()=>{
+
+    jest.spyOn(MockNgRedux.getInstance(), 'getState').mockReturnValue({
+      global: {
+        "drawingBoardStatus": DrawingBoardModes.RETRY
+      }
+    });
+    jest.spyOn(_sharedTreeService, 'isRetryMode').mockReturnValue(true);
+    let node = {
+      data : {
+        "modelId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "action": "Create",
+        "isFailed": true,
+      }
+    };
+    let serviceModelId = "6b528779-44a3-4472-bdff-9cd15ec93450";
+    let result = vnfGroupModel.getMenuAction(<any>node, serviceModelId);
+    spyOn(result['showAuditInfo'], 'method');
+    expect(result['showAuditInfo']).toBeDefined();
+    expect(result['showAuditInfo'].visible(node)).toBeTruthy();
+    expect(result['showAuditInfo'].enable(node)).toBeTruthy();
+    result['showAuditInfo']['method'](node, serviceModelId);
+    expect(result['showAuditInfo']['method']).toHaveBeenCalledWith(node, serviceModelId);
+  });
+
+  function getServiceHierarchy(){
+    return {
+      "service": {
+        "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "name": "action-data",
+        "version": "1.0",
+        "toscaModelURL": null,
+        "category": "",
+        "serviceType": "",
+        "serviceRole": "",
+        "description": "",
+        "serviceEcompNaming": "false",
+        "instantiationType": "Macro",
+        "inputs": {
+          "2017488_adiodvpe0_ASN": {
+            "type": "string",
+            "description": "AV/PE",
+            "entry_schema": null,
+            "inputProperties": null,
+            "constraints": [],
+            "required": true,
+            "default": "AV_vPE"
+          }
+        },
+        "vidNotions": {
+          "instantiationUI": "legacy",
+          "modelCategory": "other"
+        }
+      },
+      "vnfGroups": {
+        "ResourceGroup0": {
+          "type": "VnfGroup",
+          "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+          "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+          "version": "1",
+          "name": "ResourceGroup0",
+          "modelCustomizationName": "ResourceGroup0",
+          "properties": {
+            "contained_resource_type": "VF",
+            "role": "SERVICE-ACCESS",
+            "function": "DATA",
+            "description": "DDD0",
+            "type": "LOAD-GROUP"
+          },
+          "members": {
+            "vdbe_svc_vprs_proxy 0": {
+              "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+              "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+              "description": "A Proxy for Service vDBE_Svc_vPRS",
+              "name": "vDBE_Svc_vPRS Service Proxy",
+              "version": "1.0",
+              "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9",
+              "inputs": {},
+              "commands": {},
+              "properties": {},
+              "type": "Service Proxy",
+              "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274",
+              "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14",
+              "sourceModelName": "vDBE_Svc_vPRS"
+            },
+            "vdbe_svc_vprs_proxy 1": {
+              "uuid": "111dfa8-a0d9-443f-95ad-836cd044e26c",
+              "invariantUuid": "111ae0c-b3a5-4ca1-a777-afbffe7010bc",
+              "description": "A Proxy for Service vDBE_Svc_vPRS",
+              "name": "111_Svc_vPRS Service Proxy",
+              "version": "1.0",
+              "customizationUuid": "1113d23-e132-4ce7-af2c-a493b4cafac9",
+              "inputs": {},
+              "commands": {},
+              "properties": {},
+              "type": "Service Proxy",
+              "sourceModelUuid": "11127a2-366d-4be6-8c68-a69153c61274",
+              "sourceModelInvariant": "1112e6b-584b-4f45-80d4-fefd75fd9f14",
+              "sourceModelName": "111_Svc_vPRS"
+            }
+          }
+        }
+      },
+      "networks": {},
+      "collectionResource": {},
+      "configurations": {},
+      "fabricConfigurations": {},
+      "serviceProxies": {},
+      "vfModules": {},
+      "volumeGroups": {},
+      "pnfs": {}
+    }
+  }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vnfGrouping/vnfGrouping.model.info.ts
new file mode 100644 (file)
index 0000000..7f2052a
--- /dev/null
@@ -0,0 +1,272 @@
+import {ILevelNodeInfo} from "../basic.model.info";
+import {DynamicInputsService} from "../../dynamicInputs.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
+import {VnfGroupModel} from "../../../../../shared/models/vnfGroupModel";
+import {VnfGroupTreeNode} from "../../../../../shared/models/vnfGroupTreeNode";
+import {SharedTreeService} from "../../shared.tree.service";
+import {VnfGroupPopupService} from "../../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {
+  GenericFormPopupComponent,
+  PopupType
+} from "../../../../../shared/components/genericFormPopup/generic-form-popup.component";
+import {DialogService} from 'ng2-bootstrap-modal';
+import {AppState} from "../../../../../shared/store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {changeInstanceCounter, removeInstance} from "../../../../../shared/storeUtil/utils/general/general.actions";
+import {IframeService} from "../../../../../shared/utils/iframe.service";
+import {
+  deleteActionVnfGroupInstance,
+  undoDeleteActionVnfGroupInstance
+} from "../../../../../shared/storeUtil/utils/vnfGroup/vnfGroup.actions";
+import {RelatedVnfMemberInfoModel} from "../relatedVnfMember/relatedVnfMember.info.model";
+import {SearchMembersModalComponent} from "../../../../../shared/components/searchMembersModal/search-members-modal.component";
+import * as _ from "lodash";
+import {MessageBoxData} from "../../../../../shared/components/messageBox/messageBox.data";
+import {MessageBoxService} from "../../../../../shared/components/messageBox/messageBox.service";
+
+export class VnfGroupingModelInfo implements ILevelNodeInfo {
+  constructor(private _dynamicInputsService: DynamicInputsService,
+              private _sharedTreeService: SharedTreeService,
+              private _dialogService: DialogService,
+              private _vnfGroupPopupService: VnfGroupPopupService,
+              private _iframeService: IframeService,
+              private _store: NgRedux<AppState>) {
+  }
+
+  name: string = 'vnfGroups';
+  type: string = 'VnfGroup';
+  typeName: string = 'G';
+  childType: string = 'RelatedVnfMemberInfoModel';
+  childName: string = 'vnfs';
+  limitMembers : number;
+
+  /***********************************************************
+   * return if user should provide instance name or not.
+   *        get info from parent (VNF)
+   * @param currentModel - current Model object
+   ************************************************************/
+  isEcompGeneratedNaming(currentModel): boolean {
+    const ecompGeneratedNaming = currentModel.properties.ecomp_generated_naming;
+    return ecompGeneratedNaming === "true";
+  }
+
+  /***********************************************************
+   * return model dynamic inputs
+   * @param currentModel - current Model object
+   ************************************************************/
+  updateDynamicInputsDataFromModel = (currentModel): any => {
+    let displayInputs = currentModel.inputs;
+    return _.isEmpty(displayInputs) ? [] : this._dynamicInputsService.getArbitraryInputs(displayInputs);
+  };
+
+  /***********************************************************
+   * return next level object (null because is last level)
+   ************************************************************/
+  getNextLevelObject = (): RelatedVnfMemberInfoModel => {
+    return new RelatedVnfMemberInfoModel(this._sharedTreeService, this._dynamicInputsService, this._store);
+  };
+
+  getTooltip = (): string => 'VnfGroup';
+
+  getType = (): string => 'VnfGroup';
+
+  createInstanceTreeNode(instance: any, model: any, parentModel: any, storeKey: string): any {
+    let node = new VnfGroupTreeNode(instance, model, storeKey);
+    node.missingData = this.hasMissingData(instance, node, model.isEcompGeneratedNaming);
+    node = this._sharedTreeService.addingStatusProperty(node);
+    node.typeName = this.typeName;
+    node.menuActions = this.getMenuAction(<any>node, model.uuid);
+    node.isFailed = _.isNil(instance.isFailed) ? false : instance.isFailed;
+    node.statusMessage = !_.isNil(instance.statusMessage) ? instance.statusMessage: "";
+    node.limitMembers = (!_.isNil(model.properties.quantity)) ? model.properties.quantity : null;
+    return node;
+  }
+
+  getModel(modelId: string, instance: any, serviceHierarchy): any {
+    const originalModelName = instance.originalName ? instance.originalName : modelId;
+    return new VnfGroupModel(serviceHierarchy[this.name][originalModelName]);
+  }
+
+  hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+    return this._sharedTreeService.hasMissingData(instance, dynamicInputs, isEcompGeneratedNaming, []);
+  }
+
+  onClickAdd(node: ITreeNode, serviceModelId: string): void {
+    this._dialogService.addDialog(GenericFormPopupComponent, {
+      type: PopupType.VNF_GROUP,
+      uuidData: <any>{
+        serviceId: serviceModelId,
+        modelName: node.data.name,
+        vnfGroupStoreKey: null,
+        modelId: node.data.modelVersionId,
+        type: node.data.type,
+        popupService: this._vnfGroupPopupService
+      },
+      node: node,
+      isUpdateMode: false
+    });
+  }
+
+  getNodeCount(node: ITreeNode, serviceModelId: string): number {
+    let map = null;
+    if (!_.isNil(this._store.getState().service.serviceInstance[serviceModelId])) {
+      map = this._store.getState().service.serviceInstance[serviceModelId].existingVnfGroupCounterMap || 0;
+      if (!_.isNil(map)) {
+        let count = map[node.data.modelUniqueId] || 0;
+        count -= this._sharedTreeService.getExistingInstancesWithDeleteMode(node, serviceModelId, 'vnfGroups');
+        return count;
+      }
+    }
+    return 0;
+  }
+
+  /***********************************************************
+   * should show node icon
+   * @param node - current ITrees node
+   * @param serviceModelId - service id
+   ************************************************************/
+  showNodeIcons(node: ITreeNode, serviceModelId: string): AvailableNodeIcons {
+    const showAddIcon = this._sharedTreeService.shouldShowAddIcon();
+    return new AvailableNodeIcons(showAddIcon, false);
+  }
+
+  getMenuAction(node: ITreeNode, serviceModelId: string): { [methodName: string]: { method: Function, visible: Function, enable: Function } } {
+    return {
+      edit: {
+        method: (node, serviceModelId) => {
+          this._iframeService.addClassOpenModal('content');
+          this._dialogService.addDialog(GenericFormPopupComponent, {
+            type: PopupType.VNF_GROUP,
+            uuidData: <any>{
+              serviceId: serviceModelId,
+              modelName: node.data.modelName,
+              vnfGroupStoreKey: node.data.vnfGroupStoreKey,
+              modelId: node.data.modelId,
+              type: node.data.type,
+              popupService: this._vnfGroupPopupService
+            },
+            node: node,
+            isUpdateMode: true
+          });
+        },
+        visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+        enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
+      },
+      remove: {
+        method: (node, serviceModelId) => {
+          if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+            let storeKey: string = node.data.vnfGroupStoreKey;
+            this._store.dispatch(removeInstance(node.data.vnfGroupStoreKey, serviceModelId, storeKey, node));
+            this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
+            this._sharedTreeService.selectedVNF = null;
+          } else {
+            let messageBoxData: MessageBoxData = new MessageBoxData(
+              "Remove VNFGroup",  // modal title
+              "You are about to remove this group and all its children from this service. Are you sure you want to remove it?",
+              <any>"warning",
+              <any>"md",
+              [
+                {
+                  text: "Remove Group",
+                  size: "large",
+                  callback: this.removeGroup.bind(this, node, serviceModelId),
+                  closeModal: true
+                },
+                {text: "Don’t Remove", size: "medium", closeModal: true}
+              ]);
+
+            MessageBoxService.openModal.next(messageBoxData);
+          }
+        },
+        visible: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node),
+        enable: (node) => this._sharedTreeService.shouldShowRemoveAndEdit(node)
+      },
+      addGroupMember: {
+        method: (node, serviceModelId) => {
+          let serviceHierarchy = this._store.getState().service.serviceHierarchy[serviceModelId];
+          let serviceInstance = this._store.getState().service.serviceInstance[serviceModelId];
+          let vnfGroupModel = new VnfGroupModel(serviceHierarchy['vnfGroups'][node.data.modelName]);
+          this._dialogService.addDialog(SearchMembersModalComponent, {
+              title: 'Add members to group',
+              description: 'Select VNF instances to associate',
+              subscriberId: serviceInstance.globalSubscriberId,
+              serviceType: serviceInstance.subscriptionServiceType,
+              vnfGroupModel: vnfGroupModel,
+              serviceModelId: serviceModelId,
+              node: node.data,
+              searchFields: [{
+                title: 'Service model name',
+                dataTestId: 'sourceModelName',
+                value: (Object.values(vnfGroupModel.members))[0].sourceModelName
+              },
+                {
+                  title: 'Service invariant UUID',
+                  dataTestId: 'sourceModelInvariant',
+                  value: (Object.values(vnfGroupModel.members))[0].sourceModelInvariant
+                }]
+            }
+          );
+        },
+        visible: (node) => !_.isNil(node.data.action) ? node.data.action.split('_').pop() !== 'Delete' : true,
+        enable: (node) => !_.isNil(node.data.action) ? node.data.action.split('_').pop() !== 'Delete' : true
+      },
+      showAuditInfo: {
+        method: (node, serviceModelId) => {
+          let instance = this._store.getState().service.serviceInstance[serviceModelId].vnfGroups[node.data.vnfGroupStoreKey];
+          this._sharedTreeService.openAuditInfoModal(node, serviceModelId, instance, 'VNFGROUP', this);
+        },
+        visible: (node) => this._sharedTreeService.shouldShowAuditInfo(node),
+        enable: (node) => this._sharedTreeService.shouldShowAuditInfo(node)
+      },
+      delete: {
+        method: (node, serviceModelId) => {
+          if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+            this._store.dispatch(deleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
+          }else {
+            this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(node, serviceModelId, (node, serviceModelId)=>{
+              this._sharedTreeService.removeDeleteAllChild(node, serviceModelId, (node, serviceModelId)=>{
+                this._store.dispatch(deleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
+              });
+            });
+          }
+        },
+        visible: (node) => this._sharedTreeService.shouldShowDelete(node),
+        enable: (node) => this._sharedTreeService.shouldShowDelete(node)
+      },
+      undoDelete: {
+        method: (node, serviceModelId) => {
+          if ((!_.isNil(node.data.children) && node.data.children.length === 0) || _.isNil(node.data.children)) {
+            this._store.dispatch(undoDeleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
+          } else {
+            this._sharedTreeService.undoDeleteAllChild(node, serviceModelId, (node, serviceModelId) => {
+              this._store.dispatch(undoDeleteActionVnfGroupInstance(node.data.vnfGroupStoreKey, serviceModelId));
+            });
+          }
+        },
+        visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
+        enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
+      }
+    };
+
+
+  }
+
+  removeGroup(this, node, serviceModelId) {
+    this._store.dispatch(removeInstance(node.data.modelName, serviceModelId, node.data.vnfGroupStoreKey, node));
+    this._store.dispatch(changeInstanceCounter(node.data.modelUniqueId, serviceModelId, -1, node));
+    this._sharedTreeService.selectedVNF = null;
+  }
+
+  updatePosition(that , node, instanceId): void {
+    // TODO
+  }
+
+  getNodePosition(instance): number {
+    return !_.isNil(instance) ? instance.position : null;
+  }
+
+  onSelectedNode(node: ITreeNode): void {
+  }
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.spec.ts
new file mode 100644 (file)
index 0000000..fd39ed9
--- /dev/null
@@ -0,0 +1,2764 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {NgRedux} from "@angular-redux/store";
+import {ObjectToInstanceTreeService} from "./objectToInstanceTree.service";
+import {SharedTreeService} from "../shared.tree.service";
+import {DynamicInputsService} from "../dynamicInputs.service";
+import {DefaultDataGeneratorService} from "../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {AvailableModelsTreeService} from "../../available-models-tree/available-models-tree.service";
+import {ObjectToTreeService} from "../objectToTree.service";
+import {DrawingBoardModes} from "../../drawing-board.modes";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VnfPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {BasicControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../../shared/services/aaiService/aai.service";
+import {FeatureFlagsService} from "../../../../shared/services/featureFlag/feature-flags.service";
+import {VnfControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {GenericFormService} from "../../../../shared/components/genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {LogService} from "../../../../shared/utils/log/log.service";
+import {IframeService} from "../../../../shared/utils/iframe.service";
+import {BasicPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/basic.popup.service";
+import {NetworkPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {NetworkControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {VfModulePopuopService} from "../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModuleControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {VnfGroupPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {VnfGroupControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {DuplicateService} from "../../duplicate/duplicate.service";
+import {SdcUiComponentsModule, SdcUiServices} from "onap-ui-angular";
+import {ErrorMsgService} from "../../../../shared/components/error-msg/error-msg.service";
+import {ComponentInfoService} from "../../component-info/component-info.service";
+
+class MockAppStore<T> {
+  getState() {
+    return {
+      global: {
+        'drawingBoardStatus': DrawingBoardModes.CREATE,
+        flags : {
+          DRAG_AND_DROP_OPERATION : false
+        }
+      }
+    }
+  }
+}
+
+describe('Model Tree Generator service', () => {
+  let injector;
+  let service: ObjectToInstanceTreeService;
+  let httpMock: HttpTestingController;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, NgReduxTestingModule, SdcUiComponentsModule],
+      providers: [
+        DuplicateService,
+        AvailableModelsTreeService,
+        ObjectToTreeService,
+        ObjectToInstanceTreeService,
+        DefaultDataGeneratorService,
+        DynamicInputsService,
+        SharedTreeService,
+        VnfPopupService,
+        VnfGroupPopupService,
+        BasicControlGenerator,
+        GenericFormService,
+        FormBuilder,
+        LogService,
+        IframeService,
+        BasicPopupService,
+        NetworkPopupService,
+        NetworkControlGenerator,
+        VfModulePopuopService,
+        VfModuleControlGenerator,
+        VnfGroupControlGenerator,
+        DialogService,
+        FeatureFlagsService,
+        VnfControlGenerator,
+        AaiService,
+        DialogService,
+        ErrorMsgService,
+        ComponentInfoService,
+        SdcUiServices.ModalService,
+        { provide: NgRedux, useClass: MockAppStore },
+        MockNgRedux]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(ObjectToInstanceTreeService);
+    httpMock = injector.get(HttpTestingController);
+
+  })().then(done).catch(done.fail));
+
+  test('ObjectToInstanceTreeService should be defined', () => {
+    expect(service).toBeDefined();
+  });
+
+
+  test('should return instance nodes correctly: VNF', () => {
+
+    let convertToNodes = service.convertServiceInstanceToTreeData(getInstanceServiceVNF(), getServiceInstanceHierarchy());
+    delete convertToNodes[0].menuActions;
+    delete convertToNodes[0].errors;
+    delete convertToNodes[0].isFailed;
+    delete convertToNodes[0].trackById;
+    delete convertToNodes[0].updatePoistionFunction;
+    delete convertToNodes[0].position;
+    delete convertToNodes[0].onSelectedNode;
+    delete convertToNodes[1].children[0].isFailed;
+    delete convertToNodes[1].children[0].menuActions;
+    delete convertToNodes[1].children[0].trackById;
+    delete convertToNodes[1].children[0].errors;
+    delete convertToNodes[1].children[0].updatePoistionFunction;
+    delete convertToNodes[1].children[0].position;
+    delete convertToNodes[1].children[0].onSelectedNode;
+    expect(Object.assign({}, convertToNodes[0])).toEqual(Object.assign({}, expectInstanceNodesResultVNF()[0]));
+    expect(Object.assign({}, convertToNodes[1].children[0])).toEqual(Object.assign({}, expectInstanceNodesResultVNF()[1].children[0]));
+    expect(convertToNodes[1].inMaint).toBeFalsy();
+    expect(convertToNodes[0].inMaint).toBeTruthy();
+    expect(service.numberOfFailed).toBe(0);
+    expect(service.numberOfElements).toBe(3);
+  });
+
+  test('should return instance nodes correctly: VNF and Network', () => {
+    let convertToNodes = service.convertServiceInstanceToTreeData(getInstanceServiceVNF_Network(), getServiceHeirarchyVNF_Network());
+
+    delete convertToNodes[1].menuActions;
+    delete convertToNodes[1].trackById;
+    delete convertToNodes[1].errors;
+    delete convertToNodes[1].isFailed;
+    delete convertToNodes[1].updatePoistionFunction;
+    delete convertToNodes[1].position;
+    delete convertToNodes[1].onSelectedNode;
+    expect(Object.assign({}, convertToNodes[0].children[0].dynamicInputs)).toEqual(Object.assign({}, expectInstanceNodesResultVNF_Network()[0]['children'][0].dynamicInputs));
+    expect(Object.assign({}, convertToNodes[0].children[0].missingData)).toEqual(Object.assign({}, expectInstanceNodesResultVNF_Network()[0]['children'][0].missingData));
+    expect(Object.assign({}, convertToNodes[1])).toEqual(Object.assign({}, expectInstanceNodesResultVNF_Network()[1]));
+    expect(service.numberOfFailed).toBe(0);
+    expect(service.numberOfElements).toBe(5);
+  });
+
+  function getServiceInstanceHierarchy() {
+    return {
+      "service": {
+        "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "name": "action-data",
+        "version": "1.0",
+        "toscaModelURL": null,
+        "category": "",
+        "serviceType": "",
+        "serviceRole": "",
+        "description": "",
+        "serviceEcompNaming": "false",
+        "instantiationType": "Macro",
+        "inputs": {
+          "2017488_adiodvpe0_ASN": {
+            "type": "string",
+            "description": "AV/PE",
+            "entry_schema": null,
+            "inputProperties": null,
+            "constraints": [],
+            "required": true,
+            "default": "AV_vPE"
+          }
+        },
+        "vidNotions": {
+          "instantiationUI": "legacy",
+          "modelCategory": "other"
+        }
+      },
+      "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,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "max_instances": "3",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              },
+              "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",
+                "baseModule": true
+              },
+              "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": false
+              },
+              "inputs": {
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+                  "constraints": null,
+                  "required": true,
+                  "default": "17.2"
+                },
+                "bandwidth_units": {
+                  "type": "string",
+                  "description": "Units of bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth_units"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth_units",
+                  "constraints": null,
+                  "required": true,
+                  "default": "Gbps"
+                },
+                "bandwidth": {
+                  "type": "string",
+                  "description": "Requested VPE bandwidth",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "bandwidth"
+                  },
+                  "fromInputName": "adiodvpe0_bandwidth",
+                  "constraints": null,
+                  "required": true,
+                  "default": "10"
+                },
+                "AIC_CLLI": {
+                  "type": "string",
+                  "description": "AIC Site CLLI",
+                  "entry_schema": null,
+                  "inputProperties": {
+                    "sourceType": "HEAT",
+                    "vfModuleLabel": "ADIOD_vRE_BV",
+                    "paramName": "AIC_CLLI"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+                  "constraints": null,
+                  "required": true,
+                  "default": "ATLMY8GA"
+                },
+                "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"
+                  },
+                  "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+                  "constraints": null,
+                  "required": true,
+                  "default": "mtnj309me6"
+                }
+              }
+            },
+            "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",
+                "baseModule": false
+              },
+              "inputs": {}
+            }
+          },
+          "vfcInstanceGroups": {}
+        }
+      },
+      "networks": {},
+      "collectionResource": {},
+      "configurations": {},
+      "fabricConfigurations": {},
+      "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          },
+          "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",
+            "baseModule": true
+          },
+          "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",
+            "baseModule": false
+          },
+          "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",
+            "baseModule": false
+          },
+          "inputs": {
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_config_template_version",
+              "constraints": null,
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth_units"
+              },
+              "fromInputName": "adiodvpe0_bandwidth_units",
+              "constraints": null,
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "bandwidth"
+              },
+              "fromInputName": "adiodvpe0_bandwidth",
+              "constraints": null,
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": {
+                "sourceType": "HEAT",
+                "vfModuleLabel": "ADIOD_vRE_BV",
+                "paramName": "AIC_CLLI"
+              },
+              "fromInputName": "2017488_adiodvpe0_AIC_CLLI",
+              "constraints": null,
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "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"
+              },
+              "fromInputName": "2017488_adiodvpe0_vnf_instance_name",
+              "constraints": null,
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          }
+        },
+        "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",
+            "baseModule": false
+          },
+          "inputs": {}
+        }
+      },
+      "pnfs": {}
+    }
+  }
+
+  function getServiceHeirarchyVNF_Network() {
+    return {
+      "service": {
+        "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "name": "action-data",
+        "version": "1.0",
+        "toscaModelURL": null,
+        "category": "",
+        "serviceType": "",
+        "serviceRole": "",
+        "description": "",
+        "serviceEcompNaming": "false",
+        "instantiationType": "A-La-Carte",
+        "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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",
+            "max_instances": 5
+          },
+          "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": 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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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",
+            "max_instances": "3",
+            "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",
+            "min_instances": "1",
+            "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+            "vf_module_id": "123",
+            "nf_function": "JAI",
+            "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+            "vmxvre_int_ctl_ip_0": "10.0.0.10",
+            "ecomp_generated_naming": "false",
+            "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.0.0.10",
+            "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": {
+        "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": {
+            "vnf_config_template_version": {
+              "type": "string",
+              "description": "VPE Software Version",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "17.2"
+            },
+            "bandwidth_units": {
+              "type": "string",
+              "description": "Units of bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "Gbps"
+            },
+            "bandwidth": {
+              "type": "string",
+              "description": "Requested VPE bandwidth",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "10"
+            },
+            "AIC_CLLI": {
+              "type": "string",
+              "description": "AIC Site CLLI",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "ATLMY8GA"
+            },
+            "ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            },
+            "vnf_instance_name": {
+              "type": "string",
+              "description": "The hostname assigned to the vpe.",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "mtnj309me6"
+            }
+          },
+          "commands": {},
+          "properties": {
+            "network_role": "network role 1, network role 2",
+            "min_instances": 1,
+            "max_instances": 10,
+            "ecomp_generated_naming": "true",
+            "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": {},
+      "fabricConfigurations": {},
+      "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
+        }
+      }
+    }
+  }
+
+  function getInstanceServiceVNF() {
+    return {
+      "vnfs": {
+        "2017-388_ADIOD-vPE 0": {
+          "action": 'None',
+          "inMaint": true,
+          "orchStatus": "Active",
+          "provStatus": "prov",
+          "rollbackOnFailure": "true",
+          "originalName": "2017-388_ADIOD-vPE 0",
+          "isMissingData": true,
+          "trackById": "u5mtsvzmq6p",
+          "vfModules": {},
+          "vnfStoreKey": "2017-388_ADIOD-vPE 0",
+          "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+          "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+          "lcpCloudRegionId": null,
+          "tenantId": null,
+          "lineOfBusiness": null,
+          "statusMessage": "Failed Vnf Message",
+          "platformName": null,
+          "modelInfo": {
+            "modelType": "VF",
+            "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+            "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+            "modelName": "2017-388_ADIOD-vPE",
+            "modelVersion": "4.0",
+            "modelCustomizationName": "2017-388_ADIOD-vPE 0"
+          }
+        },
+        "2017-488_ADIOD-vPE 0": {
+          "action": 'None',
+          "inMaint": false,
+          "rollbackOnFailure": "true",
+          "originalName": "2017-488_ADIOD-vPE 0",
+          "isMissingData": false,
+          "trackById": "1d6dg4fsgbm",
+          "vfModules": {
+            "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0zssmp": {
+                "action": 'None',
+                "isMissingData": true,
+                "sdncPreReload": null,
+                "modelInfo": {
+                  "modelType": "VFmodule",
+                  "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                  "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                  "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                  "modelVersion": "5",
+                  "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                  "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                  "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"
+                },
+                "instanceParams": [
+                  {}
+                ],
+                "trackById": "v2egx1b8i1l",
+                "statusMessage": "Failed vfModel message"
+              }
+            }
+          },
+          "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+          "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+          "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+          "lcpCloudRegionId": "JANET25",
+          "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+          "lineOfBusiness": "ONAP",
+          "platformName": "platform",
+          "modelInfo": {
+            "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",
+            "modelUniqueId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+            "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+          },
+          "instanceName": "2017488_ADIODvPE",
+          "legacyRegion": "123",
+          "instanceParams": [
+            {}
+          ]
+        }
+      },
+      "instanceParams": [
+        {
+          "2017488_adiodvpe0_ASN": "AV_vPE"
+        }
+      ],
+      "validationCounter": 3,
+      "existingNames": {
+        "yoav": ""
+      },
+      "existingVNFCounterMap": {
+        "afacccf6-397d-45d6-b5ae-94c39734b168": 1,
+        "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1
+      },
+      "existingNetworksCounterMap": {},
+      "networks": {},
+      "instanceName": "yoav",
+      "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+      "subscriptionServiceType": "TYLER SILVIA",
+      "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+      "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+      "lcpCloudRegionId": "JANET25",
+      "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+      "aicZoneId": "ABC15",
+      "projectName": "WATKINS",
+      "rollbackOnFailure": "true",
+      "bulkSize": 1,
+      "aicZoneName": "AAITESAN-ABC15",
+      "owningEntityName": "WayneHolland",
+      "testApi": "VNF_API",
+      "isEcompGeneratedNaming": false,
+      "tenantName": "USP-SIP-IC-24335-T-01",
+      "modelInfo": {
+        "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "modelName": "action-data",
+        "modelVersion": "1.0",
+        "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+      },
+      "isALaCarte": false,
+      "name": "action-data",
+      "version": "1.0",
+      "description": "",
+      "category": "",
+      "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+      "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+      "serviceType": "",
+      "serviceRole": "",
+      "isMultiStepDesign": false
+    }
+  }
+
+  function getInstanceServiceVNF_Network() {
+    return {
+      "vnfs": {
+        "2017-488_ADIOD-vPE 0": {
+          "action": 'None',
+          "rollbackOnFailure": "true",
+          "originalName": "2017-488_ADIOD-vPE 0",
+          "isMissingData": false,
+          "trackById": "o65b26t2thj",
+          "vfModules": {
+            "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+                "action": 'None',
+                "instanceName": "yoav",
+                "volumeGroupName": "123",
+                "modelInfo": {
+                  "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                  "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                  "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                  "modelVersion": "6",
+                  "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                  "modelUniqueId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                  "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                  "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                },
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                "isMissingData": false,
+                "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"
+                  }
+                ]
+              }
+            }
+          },
+          "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+          "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+          "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+          "lcpCloudRegionId": "hvf6",
+          "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+          "lineOfBusiness": "ONAP",
+          "platformName": "platform",
+          "modelInfo": {
+            "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",
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+          },
+          "instanceName": "2017488_ADIODvPE",
+          "instanceParams": [
+            {}
+          ]
+        }
+      },
+      "instanceParams": [
+        {
+          "2017488_adiodvpe0_ASN": "AV_vPE"
+        }
+      ],
+      "validationCounter": 0,
+      "existingNames": {
+        "123": "",
+        "yoav": "",
+        "instancename": "",
+        "extvl": ""
+      },
+      "existingVNFCounterMap": {
+        "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1
+      },
+      "existingNetworksCounterMap": {
+        "ddc3f20c-08b5-40fd-af72-c6d14636b986": 3
+      },
+      "networks": {
+        "ExtVL 0": {
+          "action": "None",
+          "rollbackOnFailure": "true",
+          "isMissingData": false,
+          "originalName": "ExtVL 0",
+          "networkStoreKey": "ExtVL 0",
+          "trackById": "sf3zth68xjf",
+          "statusMessage": "Network failed message",
+          "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+          "lcpCloudRegionId": "hvf6",
+          "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+          "platformName": "xxx1",
+          "lineOfBusiness": "ONAP",
+          "instanceParams": [
+            {}
+          ],
+          "modelInfo": {
+            "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+            "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+            "modelName": "ExtVL",
+            "modelVersion": "37.0",
+            "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+            "modelCustomizationName": "ExtVL 0",
+            "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+          },
+          "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+        },
+        "ExtVL 0:0001": {
+          "action": "None",
+          "rollbackOnFailure": "true",
+          "isMissingData": false,
+          "originalName": "ExtVL 0",
+          "networkStoreKey": "ExtVL 0",
+          "trackById": "2mdxioxca9h",
+          "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+          "lcpCloudRegionId": "hvf6",
+          "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+          "platformName": "xxx1",
+          "lineOfBusiness": "ONAP",
+          "instanceParams": [
+            {}
+          ],
+          "modelInfo": {
+            "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+            "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+            "modelName": "ExtVL",
+            "modelVersion": "37.0",
+            "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+            "modelCustomizationName": "ExtVL 0",
+            "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+          },
+          "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+        },
+        "ExtVL 0_1": {
+          "action": "None",
+          "rollbackOnFailure": "true",
+          "isMissingData": false,
+          "originalName": "ExtVL 0",
+          "networkStoreKey": "ExtVL 0_1",
+          "trackById": "z7vd1gmpbs",
+          "instanceName": "ExtVL",
+          "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+          "lcpCloudRegionId": "hvf6",
+          "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+          "platformName": "xxx1",
+          "lineOfBusiness": "zzz1",
+          "instanceParams": [
+            {
+              "vnf_config_template_version": "17.2",
+              "bandwidth_units": "Gbps",
+              "bandwidth": "10",
+              "AIC_CLLI": "ATLMY8GA",
+              "ASN": "AV_vPE",
+              "vnf_instance_name": "yoav"
+            }
+          ],
+          "modelInfo": {
+            "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+            "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+            "modelName": "ExtVL",
+            "modelVersion": "37.0",
+            "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+            "modelCustomizationName": "ExtVL 0",
+            "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+          },
+          "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+        }
+      },
+      "instanceName": "InstanceName",
+      "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+      "subscriptionServiceType": "TYLER SILVIA",
+      "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+      "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+      "lcpCloudRegionId": "JANET25",
+      "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+      "aicZoneId": "JAG1",
+      "projectName": null,
+      "rollbackOnFailure": "true",
+      "bulkSize": 1,
+      "aicZoneName": "YUDFJULP-JAG1",
+      "owningEntityName": "WayneHolland",
+      "testApi": "GR_API",
+      "isEcompGeneratedNaming": false,
+      "tenantName": "USP-SIP-IC-24335-T-01",
+      "modelInfo": {
+        "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "modelName": "action-data",
+        "modelVersion": "1.0",
+        "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+      },
+      "isALaCarte": false,
+      "name": "action-data",
+      "version": "1.0",
+      "description": "",
+      "category": "",
+      "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+      "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+      "serviceType": "",
+      "serviceRole": "",
+      "isMultiStepDesign": false
+    }
+  }
+
+  function expectInstanceNodesResultVNF() {
+    return [
+      {
+        "action": 'None',
+        "modelId": "afacccf6-397d-45d6-b5ae-94c39734b168",
+        "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+        "modelUniqueId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+        "missingData": true,
+        "id": "u5mtsvzmq6p",
+        "orchStatus": 'Active',
+        "provStatus": 'prov',
+        "inMaint": true,
+        "name": "2017-388_ADIOD-vPE 0",
+        "modelName": "2017-388_ADIOD-vPE 0",
+        "type": "VF",
+        "parentType": '',
+        "isEcompGeneratedNaming": false,
+        "networkStoreKey": "2017-388_ADIOD-vPE 0",
+        "vnfStoreKey": "2017-388_ADIOD-vPE 0",
+        "typeName": "VNF",
+        "children": [],
+        "statusMessage": "Failed Vnf Message",
+        "statusProperties": [Object({
+          key: 'Prov Status:',
+          value: 'prov',
+          testId: 'provStatus'
+        }), Object({ key: 'Orch Status:', value: 'Active', testId: 'orchStatus' }), Object({
+          key: 'In-maintenance',
+          value: '',
+          testId: 'inMaint'
+        })]
+      },
+      {
+        "action": 'None',
+        "modelId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+        "missingData": false,
+        "id": "1d6dg4fsgbm",
+        "inMaint": false,
+        "parentType": '',
+        "name": "2017-488_ADIOD-vPE 0",
+        "modelName": "2017-488_ADIOD-vPE 0",
+        "type": "VF",
+        "isEcompGeneratedNaming": false,
+        "networkStoreKey": "2017-488_ADIOD-vPE 0",
+        "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+        "typeName": "VNF",
+        "statusProperties": [Object({
+          key: 'Prov Status:',
+          value: undefined,
+          testId: 'provStatus'
+        }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })],
+        "children": [{
+          "parentType": 'VNF',
+          "action": 'None',
+          "modelId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+          "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+          "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+          "missingData": true,
+          "id": "v2egx1b8i1l",
+          "statusMessage": "Failed vfModel message",
+          "name": "&lt;Automatically Assigned&gt;",
+          "modelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+          "type": "VFmodule",
+          "isEcompGeneratedNaming": false,
+          "dynamicInputs": [],
+          "dynamicModelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0zssmp",
+          "typeName": "M",
+          "statusProperties": [Object({
+            key: 'Prov Status:',
+            value: undefined,
+            testId: 'provStatus'
+          }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })],
+        }]
+      }]
+  }
+
+  function expectInstanceNodesResultVNF_Network() {
+    return [
+      {
+        "parentType": '',
+        "action": 'None',
+        "modelId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+        "missingData": false,
+        "id": "o65b26t2thj",
+        "name": "2017488_ADIODvPE",
+        "modelName": "2017-488_ADIOD-vPE 0",
+        "type": "VF",
+        "isEcompGeneratedNaming": false,
+        "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+        "typeName": "VNF",
+        "statusProperties": [Object({
+          key: 'Prov Status:',
+          value: undefined,
+          testId: 'provStatus'
+        }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })],
+        "children": [
+          {
+            "action": 'None',
+            "modelId": "25284168-24bb-4698-8cb4-3f509146eca5",
+            "missingData": false,
+            "name": "yoav",
+            "modelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "type": "VFmodule",
+            "isEcompGeneratedNaming": false,
+            "typeName": "M",
+            "dynamicInputs": [
+              {
+                "id": "adiodvpe0_bandwidth",
+                "type": "string",
+                "name": "adiodvpe0_bandwidth",
+                "value": "10",
+                "isRequired": true,
+                "description": "Requested VPE bandwidth"
+              },
+              {
+                "id": "2017488_adiodvpe0_vnf_instance_name",
+                "type": "string",
+                "name": "2017488_adiodvpe0_vnf_instance_name",
+                "value": "mtnj309me6",
+                "isRequired": true,
+                "description": "The hostname assigned to the vpe."
+              },
+              {
+                "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"
+              },
+              {
+                "id": "adiodvpe0_bandwidth_units",
+                "type": "string",
+                "name": "adiodvpe0_bandwidth_units",
+                "value": "Gbps",
+                "isRequired": true,
+                "description": "Units of bandwidth"
+              }
+            ],
+            "dynamicModelName": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi"
+          }
+        ]
+      },
+      {
+        "parentType": '',
+        "action": 'None',
+        "modelId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+        "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+        "modelUniqueId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+        "missingData": false,
+        "id": "sf3zth68xjf",
+        "name": "&lt;Automatically Assigned&gt;",
+        "statusMessage": "Network failed message",
+        "modelName": "ExtVL 0",
+        "type": "VL",
+        "isEcompGeneratedNaming": true,
+        "networkStoreKey": "ExtVL 0",
+        "typeName": "N",
+        "statusProperties": [Object({
+          key: 'Prov Status:',
+          value: undefined,
+          testId: 'provStatus'
+        }), Object({ key: 'Orch Status:', value: undefined, testId: 'orchStatus' })],
+      },
+      {
+        "parentType": '',
+        "action": 'None',
+        "originalAction": 'None',
+        "modelId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+        "missingData": false,
+        "id": "2mdxioxca9h",
+        "name": "&lt;Automatically Assigned&gt;",
+        "modelName": "ExtVL 0",
+        "type": "VL",
+        "isEcompGeneratedNaming": true,
+        "networkStoreKey": "ExtVL 0:0001",
+        "typeName": "M"
+      },
+      {
+        "parentType": '',
+        "action": 'None',
+        "originalAction": 'None',
+        "modelId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+        "missingData": false,
+        "id": "z7vd1gmpbs",
+        "name": "ExtVL",
+        "modelName": "ExtVL 0",
+        "type": "VL",
+        "isEcompGeneratedNaming": true,
+        "networkStoreKey": "ExtVL 0_1",
+        "typeName": "M"
+      }
+    ];
+  }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToInstanceTree/objectToInstanceTree.service.ts
new file mode 100644 (file)
index 0000000..1fc439e
--- /dev/null
@@ -0,0 +1,163 @@
+import {Injectable} from "@angular/core";
+import {ILevelNodeInfo} from "../models/basic.model.info";
+import {ObjectToTreeService} from "../objectToTree.service";
+import {DefaultDataGeneratorService} from "../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import * as _ from "lodash";
+import {ServiceInstanceActions} from "../../../../shared/models/serviceInstanceActions";
+import {ErrorMsgService} from "../../../../shared/components/error-msg/error-msg.service";
+import {FeatureFlagsService, Features} from "../../../../shared/services/featureFlag/feature-flags.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../shared/store/reducers";
+
+@Injectable()
+export class ObjectToInstanceTreeService {
+  constructor(private _objectToTreeService: ObjectToTreeService, private _errorMsgService: ErrorMsgService, private store: NgRedux<AppState>) {
+    this.numberOfFailed = 0;
+    this.numberOfElements = 0;
+
+  }
+
+  /** store number of failed ********  ONLY IN RETRY MODE  ******** **/
+  numberOfFailed: number = 0;
+
+  /** store number of existing elements **/
+  numberOfElements: number = 0;
+
+  /*****************************************************************
+   * return array of first level node with there child's
+   * @param serviceInstance - The service instance object from store
+   * @param serviceHierarchy - The service Hierarchy store
+   ****************************************************************/
+  convertServiceInstanceToTreeData(serviceInstance, serviceHierarchy): any[] {
+    this._errorMsgService.triggerClearError.next();
+    let nodes = [];
+    this.numberOfFailed = 0;
+    this.numberOfElements = 0;
+    let _this = this;
+    const firstLevelOptions: ILevelNodeInfo[] = _this._objectToTreeService.getFirstLevelOptions();
+    for (let option of firstLevelOptions) {
+      _.forOwn(serviceInstance[option.name], function (instance, modelName) {
+        nodes.push(_this.getNodeInstance(modelName, null, instance, serviceHierarchy, option));
+      });
+    }
+    return this.sortElementsByPosition(nodes);
+  }
+
+  /*****************************************************************
+   * should increase number of failed
+   * @param node - the current node
+   ****************************************************************/
+  increaseNumberOfFailed(node) {
+    if (node.isFailed) {
+      this.numberOfFailed++;
+      node['errors'] = !_.isNil(node['errors']) ? node['errors'] : {};
+      node['errors']["isFailed"] = true;
+      this._errorMsgService.triggerShowError.next(this._errorMsgService.getRetryErrorObject(this.numberOfFailed));
+    }
+  }
+
+  /*****************************************************************
+   * should increase number of existing elements
+   * @param node - the current node
+   ****************************************************************/
+  increaseNumberOfExcitingElements() {
+    this.numberOfElements++;
+  }
+
+  /*****************************************************************
+   * return array of first level node with there child's
+   * @param modelName
+   * @param parentModel
+   * @param instance
+   * @param serviceHierarchy - The service Hierarchy store
+   * @param option
+   * @param parentType
+   ****************************************************************/
+  getNodeInstance(modelName: string, parentModel: any, instance: any, serviceHierarchy, option: ILevelNodeInfo, parentType ?: string) {
+    const model = option.getModel(modelName, instance, serviceHierarchy);
+
+    let optionalNodes = option.createInstanceTreeNode(instance, model, parentModel, modelName);
+    this.increaseNumberOfFailed(optionalNodes);
+    this.increaseNumberOfExcitingElements();
+    let nodes: any[] = _.isArray(optionalNodes) ? optionalNodes : [optionalNodes];
+    for (let node of nodes) {
+      node = this.addingExtraDataToNode(node, modelName, parentModel, instance, serviceHierarchy, option, parentType);
+      let children = this.addNextInstanceTreeNode(instance, model, option, node, serviceHierarchy);
+      if (!_.isNil(children) && children.length > 0) {
+        node.children = this.sortElementsByPosition(children);
+      }
+      this.updateScalingPolicy(node);
+    }
+    return nodes.length === 1 ? nodes[0] : nodes;
+  }
+
+  addingExtraDataToNode(node, modelName: string, parentModel: any, instance: any, serviceHierarchy, option: ILevelNodeInfo, parentType ?: string) {
+    node.trackById = _.isNil(node.trackById) ? DefaultDataGeneratorService.createRandomTrackById() : node['trackById'];
+    node.parentType = !_.isNil(parentType) ? parentType : "";
+    node.updatePoistionFunction = option.updatePosition;
+    node.position = option.getNodePosition(instance, node.dynamicModelName);
+    node.onSelectedNode = option.onSelectedNode;
+    return node;
+  }
+
+  sortElementsByPosition(nodes: any[]): any[] {
+    if (!FeatureFlagsService.getFlagState(Features.DRAG_AND_DROP_OPERATION, this.store)) return nodes;
+    return nodes.sort((nodeA, nodeB) => {
+      return nodeA.position - nodeB.position;
+    });
+  }
+
+  /*****************************************************************
+   * return next level node with there child's
+   * @param parentInstance
+   * @param parentModel
+   * @param levelNodeInfo
+   * @param parentNode
+   * @param serviceHierarchy - The service Hierarchy store
+   ****************************************************************/
+  addNextInstanceTreeNode(parentInstance, parentModel, levelNodeInfo: ILevelNodeInfo, parentNode, serviceHierarchy): any[] {
+    if (!_.isNil(levelNodeInfo.childName)) {
+      parentNode.children = [];
+      if (!_.isNil(parentInstance[levelNodeInfo.childName])) {
+        let parentType = levelNodeInfo.type;
+        let nextLevelNodeInfo = levelNodeInfo.getNextLevelObject.apply(this);
+        Object.keys(parentInstance[levelNodeInfo.childName]).map((modelName) => {
+          let nextLevelInstance = parentInstance[levelNodeInfo.childName][modelName];
+          let nodes: any[] | any = this.getNodeInstance(modelName, parentModel, nextLevelInstance, serviceHierarchy, nextLevelNodeInfo, parentType);
+          if (_.isArray(nodes)) {
+            parentNode.children = parentNode.children.concat(nodes);
+          } else {
+            parentNode.children.push(nodes);
+          }
+        });
+        return this.sortElementsByPosition(parentNode.children);
+      }
+    }
+    return parentNode.children;
+  }
+
+
+  /************************************************************************************
+   * update instance scaling policy according to instance limit and existing children
+   * @param node
+   *********************************************************************************/
+  updateScalingPolicy(node): void {
+    node['errors'] = !_.isNil(node['errors']) ? node['errors'] : {};
+    if (!_.isNil(node['limitMembers']) && !_.isNil(node.children)) {
+      let effectiveChildren = (node.children).filter(child => [
+        ServiceInstanceActions.Create,
+        ServiceInstanceActions.None,
+        ServiceInstanceActions.Update
+      ].includes(child.action));
+
+
+      if (effectiveChildren.length > node.limitMembers) {
+        node['errors']["scalingError"] = true;
+        this._errorMsgService.triggerShowError.next(this._errorMsgService.getScalingErrorObject());
+      } else {
+        delete node['errors']["scalingError"];
+      }
+
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.spec.ts
new file mode 100644 (file)
index 0000000..41ad23f
--- /dev/null
@@ -0,0 +1,727 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {NgRedux} from "@angular-redux/store";
+import {ObjectToTreeService} from "../objectToTree.service";
+import {ObjectToModelTreeService} from "./objectToModelTree.service";
+import {DefaultDataGeneratorService} from "../../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {DynamicInputsService} from "../dynamicInputs.service";
+import {SharedTreeService} from "../shared.tree.service";
+import {DrawingBoardModes} from "../../drawing-board.modes";
+import {AvailableModelsTreeService} from "../../available-models-tree/available-models-tree.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VnfPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {BasicControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/basic.control.generator";
+import {GenericFormService} from "../../../../shared/components/genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {LogService} from "../../../../shared/utils/log/log.service";
+import {IframeService} from "../../../../shared/utils/iframe.service";
+import {BasicPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/basic.popup.service";
+import {NetworkPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {NetworkControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {VfModulePopuopService} from "../../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModuleControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {FeatureFlagsService} from "../../../../shared/services/featureFlag/feature-flags.service";
+import {VnfControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {AaiService} from "../../../../shared/services/aaiService/aai.service";
+import {VnfGroupPopupService} from "../../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {VnfGroupControlGenerator} from "../../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {DuplicateService} from "../../duplicate/duplicate.service";
+import {SdcUiComponentsModule} from "onap-ui-angular";
+import {ComponentInfoService} from "../../component-info/component-info.service";
+
+class MockAppStore<T> {
+  getState() {
+    return {
+      global: {
+        'drawingBoardStatus': DrawingBoardModes.CREATE
+      }
+    }
+  }
+}
+
+describe('Model Tree Generator service', () => {
+  let injector;
+  let service: ObjectToModelTreeService;
+  let httpMock: HttpTestingController;
+
+  beforeEach(() => {
+
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, NgReduxTestingModule, SdcUiComponentsModule],
+      providers: [
+        AvailableModelsTreeService,
+        ObjectToTreeService,
+        ObjectToModelTreeService,
+        DefaultDataGeneratorService,
+        DynamicInputsService,
+        SharedTreeService,
+        DialogService,
+        VnfPopupService,
+        VnfGroupPopupService,
+        BasicControlGenerator,
+        GenericFormService,
+        FormBuilder,
+        LogService,
+        IframeService,
+        BasicPopupService,
+        NetworkPopupService,
+        NetworkControlGenerator,
+        VfModulePopuopService,
+        VfModuleControlGenerator,
+        VnfGroupControlGenerator,
+        DialogService,
+        FeatureFlagsService,
+        VnfControlGenerator,
+        AaiService,
+        DialogService,
+        DuplicateService,
+        ComponentInfoService,
+        {provide: NgRedux, useClass: MockAppStore},
+        MockNgRedux]
+    }).compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(ObjectToModelTreeService);
+    httpMock = injector.get(HttpTestingController);
+  });
+
+  test('ObjectToModelTreeService should be defined', () => {
+    expect(service).toBeDefined();
+  });
+
+  test('should return nodes correctly: VNF', () => {
+
+    let convertToNodes = service.convertServiceHierarchyModelToTreeNodes(getServiceHeirarchyVNF());
+    convertToNodes.map((item) => {
+      delete item['onAddClick'];
+      delete item['getNodeCount'];
+      delete item['showNodeIcons'];
+      delete item['menuActions'];
+      delete item['getMenuAction'];
+      delete item['trackById'];
+
+      if (item.children) {
+        item.children.map((child) => {
+          delete child['onAddClick'];
+          delete child['getNodeCount'];
+          delete child['showNodeIcons'];
+          delete child['menuActions'];
+          delete child['getMenuAction'];
+          delete child['trackById'];
+        });
+      }
+    });
+
+    expect(Object.assign({}, convertToNodes)).toEqual(Object.assign({}, expectNodesResultVNF()));
+  });
+
+
+  function expectNodesResultVNF() {
+    return [{
+      "id": "280dec31-f16d-488b-9668-4aae55d6648a",
+      "modelVersionId": "0903e1c0-8e03-4936-b5c2-260653b96413",
+      "name": "2017-388_ADIOD-vPE 1",
+      "tooltip": "VF",
+      "type": "VF",
+      "count": 0,
+      "max": 1,
+      "children": [],
+      "disabled": false,
+      "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a",
+      "modelUniqueId": "280dec31-f16d-488b-9668-4aae55d6648a",
+      "dynamicInputs": [],
+      "isEcompGeneratedNaming": true,
+      "typeName": 'VNF'
+    }, {
+      "id": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+      "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168",
+      "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+      "modelUniqueId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+      "name": "2017-388_ADIOD-vPE 0",
+      "tooltip": "VF",
+      "type": "VF",
+      "count": 0,
+      "max": 1,
+      "children": [],
+      "disabled": false,
+      "dynamicInputs": [],
+      "isEcompGeneratedNaming": true,
+      "typeName": 'VNF'
+    }, {
+      "id": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+      "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+      "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+      "modelUniqueId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+      "name": "2017-488_ADIOD-vPE 0",
+      "tooltip": "VF",
+      "type": "VF",
+      "count": 0,
+      "max": 1,
+      "children": [{
+        "id": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+        "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+        "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+        "modelUniqueId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+        "name": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+        "tooltip": "VFmodule",
+        "type": "VFmodule",
+        "count": 0,
+        "max": 1,
+        "children": [],
+        "disabled": false,
+        "dynamicInputs": [],
+        "isEcompGeneratedNaming": true,
+        "typeName": 'M'
+      }, {
+        "id": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+        "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+        "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+        "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+        "name": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+        "tooltip": "VFmodule",
+        "type": "VFmodule",
+        "count": 0,
+        "max": 1,
+        "children": [],
+        "disabled": false,
+        "dynamicInputs": [],
+        "isEcompGeneratedNaming": true,
+        "typeName": 'M'
+      }, {
+        "id": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+        "modelVersionId": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+        "modelCustomizationId": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+        "modelUniqueId": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+        "name": "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+        "tooltip": "VFmodule",
+        "type": "VFmodule",
+        "count": 0,
+        "max": 1,
+        "children": [],
+        "disabled": false,
+        "dynamicInputs": [],
+        "isEcompGeneratedNaming": true,
+        "typeName": 'M'
+      }],
+      "disabled": false,
+      "dynamicInputs": [],
+      "isEcompGeneratedNaming": true,
+      "typeName": 'VNF'
+    }]
+
+  }
+
+  function getServiceHeirarchyVNF() {
+    return {
+      "service": {
+        "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+        "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+        "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": {},
+        "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other"}
+      },
+      "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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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}",
+            "multi_stage_design": "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": "10.0.0.10",
+            "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.0.0.10",
+            "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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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}",
+            "multi_stage_design": "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": "10.0.0.10",
+            "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.0.0.10",
+            "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": "10.0.0.10",
+            "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": "10.0.0.10",
+            "is_AVPN_service": "false",
+            "vmx_RSG_name": "vREXI-affinity",
+            "vmx_int_ctl_forwarding": "l2",
+            "vmxvre_oam_ip_0": "10.0.0.10",
+            "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}",
+            "multi_stage_design": "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": "10.0.0.10",
+            "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.0.0.10",
+            "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": true
+              },
+              "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": false
+              },
+              "inputs": {}
+            }
+          },
+          "vfcInstanceGroups": {}
+        }
+      },
+      "networks": {},
+      "collectionResource": {},
+      "configurations": {},
+      "fabricConfigurations": {},
+      "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",
+            "baseModule": false
+          },
+          "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",
+            "baseModule": true
+          },
+          "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",
+            "baseModule": false
+          },
+          "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",
+            "baseModule": false
+          },
+          "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",
+            "baseModule": false
+          },
+          "inputs": {}
+        }
+      },
+      "pnfs": {}
+    }
+  }
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToModelTree/objectToModelTree.service.ts
new file mode 100644 (file)
index 0000000..e941faa
--- /dev/null
@@ -0,0 +1,98 @@
+import {Injectable} from "@angular/core";
+import {ILevelNodeInfo} from "../models/basic.model.info";
+import {ObjectToTreeService} from "../objectToTree.service";
+import * as _ from "lodash";
+
+@Injectable()
+export class ObjectToModelTreeService {
+  constructor(private _objectToTreeService: ObjectToTreeService) {
+  }
+
+  /***********************************************************
+   * return array of first level node with there child's
+   * @param serviceModel - The serviceHierarchy object
+   ************************************************************/
+  convertServiceHierarchyModelToTreeNodes(serviceModel): any[] {
+    let _this = this;
+    const firstLevelOptions: ILevelNodeInfo[] = _this._objectToTreeService.getFirstLevelOptions();
+    let nodes = [];
+    for (let option of firstLevelOptions) {
+      _.forOwn(serviceModel[option.name], function (item, key) {
+        nodes.push(_this.addFirstLevelModel(serviceModel.service.uuid, key, item, item.type, serviceModel, option));
+      });
+    }
+    console.log('nodes', nodes);
+    return nodes;
+  }
+
+
+  /***********************************************************
+   * return node with all his child's
+   * @param name - Model name
+   * @param serviceId - service id
+   * @param currentModel - current Model object
+   * @param type - current Model type
+   * @param parentModel - current parent Model object
+   * @param levelNodeInfo - current level node information
+   ************************************************************/
+  private addFirstLevelModel(serviceId: string, name, currentModel, type, parentModel, levelNodeInfo: ILevelNodeInfo) {
+    let node = ObjectToModelTreeService.convertItemToTreeNode(serviceId, name, currentModel, type, null, levelNodeInfo);
+    node.children = this.addNextLevelNodes(serviceId, currentModel, parentModel, levelNodeInfo, node);
+    return node;
+  }
+
+  /***********************************************************
+   * return all the child's of node (is child exist)
+   *        else return empty array.
+   * @param currentModel - current Model object
+   * @param parentModel - current parent Model object
+   * @param levelNodeInfo - current level node information
+   * @param parentNode - parent node.
+   ************************************************************/
+  addNextLevelNodes(serviceId: string, currentModel, parentModel, levelNodeInfo: ILevelNodeInfo, parentNode): any[] {
+    if (!_.isNil(levelNodeInfo.childName)) {
+      if (!_.isNil(currentModel[levelNodeInfo.childName])) {
+        let nextLevelNodeInfo = levelNodeInfo.getNextLevelObject.apply(this);
+        parentNode.children = Object.keys(currentModel[levelNodeInfo.childName]).map((key) =>
+          ObjectToModelTreeService.convertItemToTreeNode(serviceId, key, currentModel[levelNodeInfo.childName][key], levelNodeInfo.childName, currentModel, nextLevelNodeInfo));
+
+      }
+    }
+    return parentNode.children;
+  }
+
+
+  /***********************************************************
+   * return node with his properties
+   * @param serviceId
+   * @param name - model name
+   * @param currentModel - current model from serviceHierarchy
+   * @param valueType - model type
+   * @param parentModel - current parent model
+   * @param levelNodeInfo - current levelNodeInfo object
+   ************************************************************/
+  static convertItemToTreeNode(serviceId: string, name: string, currentModel: any, valueType: string, parentModel: string, levelNodeInfo: ILevelNodeInfo) {
+    let node = {
+      id: currentModel.customizationUuid || currentModel.uuid,
+      modelCustomizationId : currentModel.customizationUuid,
+      modelVersionId:  currentModel.uuid,
+      modelUniqueId : currentModel.customizationUuid || currentModel.uuid,
+      name: name,
+      tooltip: levelNodeInfo.getTooltip(),
+      type: levelNodeInfo.getType(),
+      count: currentModel.count || 0,
+      max: currentModel.max || 1,
+      children: [],
+      disabled: false,
+      dynamicInputs: levelNodeInfo.updateDynamicInputsDataFromModel(currentModel),
+      isEcompGeneratedNaming: levelNodeInfo.isEcompGeneratedNaming(currentModel, parentModel)
+    };
+
+    node['onAddClick'] = (node, serviceId) => levelNodeInfo.onClickAdd(node, serviceId);
+    node['getNodeCount'] = (node, serviceId) => levelNodeInfo.getNodeCount(node, serviceId);
+    node['getMenuAction'] = (node, serviceId) => levelNodeInfo.getMenuAction(node, serviceId);
+    node['showNodeIcons'] = (node, serviceId) => levelNodeInfo.showNodeIcons(node, serviceId);
+    node['typeName'] = levelNodeInfo['typeName'];
+    return node;
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToTree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/objectToTree.service.ts
new file mode 100644 (file)
index 0000000..3389645
--- /dev/null
@@ -0,0 +1,51 @@
+import {Injectable} from "@angular/core";
+import {ILevelNodeInfo} from "./models/basic.model.info";
+import {VnfModelInfo} from "./models/vnf/vnf.model.info";
+import {NetworkModelInfo} from "./models/network/network.model.info";
+import {ConfigurationModelInfo} from "./models/configuration/configuration.model.info";
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {DynamicInputsService} from "./dynamicInputs.service";
+import {SharedTreeService} from "./shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VnfGroupingModelInfo} from "./models/vnfGrouping/vnfGrouping.model.info";
+import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {DuplicateService} from "../duplicate/duplicate.service";
+import {SdcUiServices} from "onap-ui-angular";
+import {IframeService} from "../../../shared/utils/iframe.service";
+import {ComponentInfoService} from "../component-info/component-info.service";
+
+@Injectable()
+export class ObjectToTreeService {
+  constructor(private _defaultDataGeneratorService: DefaultDataGeneratorService,
+              private _dynamicInputsService: DynamicInputsService,
+              private _sharedTreeService : SharedTreeService,
+              private _dialogService : DialogService,
+              private _vnfPopupService : VnfPopupService,
+              private  _networkPopupService :  NetworkPopupService,
+              private _vfModulePopupService : VfModulePopuopService,
+              private _vnfGroupPopupService : VnfGroupPopupService,
+              private _duplicateService : DuplicateService,
+              private _modalService: SdcUiServices.ModalService,
+              private _iframeService : IframeService,
+              private _componentInfoService : ComponentInfoService,
+              private _store : NgRedux<AppState>) {
+  }
+
+
+
+
+  /***********************************************************
+   * return all first optional first level of the model tree
+   ************************************************************/
+  getFirstLevelOptions(): ILevelNodeInfo[] {
+    return [new VnfModelInfo(this._dynamicInputsService, this._sharedTreeService, this._defaultDataGeneratorService, this._dialogService, this._vnfPopupService, this._vfModulePopupService, this._duplicateService, this._modalService, this._iframeService, this._componentInfoService, this._store)
+      , new NetworkModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._networkPopupService, this._duplicateService, this._modalService, this._iframeService,  this._store),
+      new ConfigurationModelInfo(this._dynamicInputsService, this._sharedTreeService),
+      new VnfGroupingModelInfo(this._dynamicInputsService, this._sharedTreeService, this._dialogService, this._vnfGroupPopupService, this._iframeService, this._store)];
+  };
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts
new file mode 100644 (file)
index 0000000..617a81e
--- /dev/null
@@ -0,0 +1,1761 @@
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {MockNgRedux, NgReduxTestingModule} from "@angular-redux/store/testing";
+import {SharedTreeService} from "./shared.tree.service";
+import {ObjectToInstanceTreeService} from "./objectToInstanceTree/objectToInstanceTree.service";
+import {ObjectToTreeService} from "./objectToTree.service";
+import {DefaultDataGeneratorService} from "../../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+import {DynamicInputsService} from "./dynamicInputs.service";
+import {DialogService} from "ng2-bootstrap-modal";
+import {VnfPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {BasicControlGenerator} from "../../../shared/components/genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../shared/services/aaiService/aai.service";
+import {NetworkPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {NetworkControlGenerator} from "../../../shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {VfModulePopuopService} from "../../../shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModuleControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {VnfGroupControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {FeatureFlagsService} from "../../../shared/services/featureFlag/feature-flags.service";
+import {VnfControlGenerator} from "../../../shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {NgRedux} from "@angular-redux/store";
+import {GenericFormService} from "../../../shared/components/genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {SdcUiComponentsModule} from "onap-ui-angular";
+import {LogService} from "../../../shared/utils/log/log.service";
+import {IframeService} from "../../../shared/utils/iframe.service";
+import {BasicPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/basic.popup.service";
+import {VnfGroupPopupService} from "../../../shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {DuplicateService} from "../duplicate/duplicate.service";
+import {AppState} from "../../../shared/store/reducers";
+import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service";
+import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service";
+import {AuditInfoModalComponent} from "../../../shared/components/auditInfoModal/auditInfoModal.component";
+import {ILevelNodeInfo} from "./models/basic.model.info";
+import {VnfModelInfo} from "./models/vnf/vnf.model.info";
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+import each from "jest-each";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import {ComponentInfoService} from "../component-info/component-info.service";
+
+class MockAppStore<T> {
+  getState() {
+    return getStore()
+  }
+
+  dispatch() {
+  }
+}
+
+class MockVnfModelInfo<T> {
+  getModel() {
+    return {}
+  }
+}
+
+
+describe('Shared Tree Service', () => {
+  let injector;
+  let service: SharedTreeService;
+  let _objectToInstanceTreeService: ObjectToInstanceTreeService;
+  let store: NgRedux<AppState>;
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, NgReduxTestingModule, SdcUiComponentsModule],
+      providers: [
+        SharedTreeService,
+        ObjectToTreeService,
+        DefaultDataGeneratorService,
+        DialogService,
+        VnfPopupService,
+        BasicControlGenerator,
+        AaiService,
+        LogService,
+        BasicPopupService,
+        VnfGroupPopupService,
+        DuplicateService,
+        IframeService,
+        DynamicInputsService,
+        NetworkPopupService,
+        NetworkControlGenerator,
+        VfModulePopuopService,
+        VfModuleControlGenerator,
+        VnfGroupControlGenerator,
+        DialogService,
+        FeatureFlagsService,
+        VnfControlGenerator,
+        AaiService,
+        DialogService,
+        GenericFormService,
+        FormBuilder,
+        ErrorMsgService,
+        ObjectToInstanceTreeService,
+        ComponentInfoService,
+        {provide: NgRedux, useClass: MockAppStore}
+      ]
+    });
+    await TestBed.compileComponents();
+    injector = getTestBed();
+    service = injector.get(SharedTreeService);
+    _objectToInstanceTreeService = injector.get(ObjectToInstanceTreeService);
+    store = injector.get(NgRedux);
+  })().then(done).catch(done.fail));
+
+  test('SharedTreeService should be defined', () => {
+    expect(service).toBeDefined();
+  });
+
+  test('shouldShowDeleteInstanceWithChildrenModal should open modal if child exist with action create', () => {
+    jest.spyOn(MessageBoxService.openModal, 'next');
+    let foo = () => {
+
+    };
+    let node = <any>{
+      children: [{action: "Create"}, {action: "None"}],
+      data: {
+        typeName: 'VNF'
+      }
+    };
+    service.shouldShowDeleteInstanceWithChildrenModal(node, "serviceModelId", foo);
+    expect(MessageBoxService.openModal.next).toHaveBeenCalled();
+  });
+
+  test('openAuditInfoModal should open modal for failed instance', () => {
+    jest.spyOn(AuditInfoModalComponent.openInstanceAuditInfoModal, 'next');
+
+    let modelInfoServiceMock: ILevelNodeInfo = new VnfModelInfo(null, null, null, null, null, null, null, null, null, null);
+    const modelMock = {"a": "a"};
+    const instanceMock = {"instance": "instance", "trackById": "123456789"};
+    const instanceTypeMock = "instanceTypeMock";
+    jest.spyOn(modelInfoServiceMock, 'getModel').mockReturnValue(modelMock);
+    let node = <any>{
+      data: {
+        modelId: '6b528779-44a3-4472-bdff-9cd15ec93450',
+        trackById: '1245df21',
+        isFailed: true
+      }
+    };
+    service.openAuditInfoModal(node, "serviceModelId", instanceMock, instanceTypeMock, <any>modelInfoServiceMock);
+    expect(AuditInfoModalComponent.openInstanceAuditInfoModal.next).toHaveBeenCalledWith(
+      {
+        "instance": instanceMock,
+        "instanceId": "serviceModelId",
+        "isInstanceFailed": node.data.isFailed,
+        "model": modelMock,
+        "trackById": instanceMock.trackById,
+        "type": instanceTypeMock
+      });
+  });
+
+  test('shouldShowDeleteInstanceWithChildrfenModal should not open modal if all childs with action None', () => {
+    let foo = () => {
+    };
+    spyOn(MessageBoxService.openModal, 'next');
+
+    let node = <any>{
+      children: [{action: "None"}, {action: "None"}],
+      data: {
+        typeName: 'VNF'
+      }
+    };
+    service.shouldShowDeleteInstanceWithChildrenModal(node, "serviceModelId", foo);
+    expect(MessageBoxService.openModal.next).not.toHaveBeenCalled();
+  });
+
+  test('statusProperties should be prop on node according to node properties', () => {
+    let node = service.addingStatusProperty({orchStatus: 'completed', provStatus: 'inProgress', inMaint: false});
+    expect(node.statusProperties).toBeDefined();
+    expect(node.statusProperties).toEqual([Object({
+      key: 'Prov Status:',
+      value: 'inProgress',
+      testId: 'provStatus'
+    }), Object({key: 'Orch Status:', value: 'completed', testId: 'orchStatus'})]);
+    node = service.addingStatusProperty({orchStatus: 'completed', provStatus: 'inProgress', inMaint: true});
+    expect(node.statusProperties).toEqual([Object({
+      key: 'Prov Status:',
+      value: 'inProgress',
+      testId: 'provStatus'
+    }), Object({key: 'Orch Status:', value: 'completed', testId: 'orchStatus'}), Object({
+      key: 'In-maintenance',
+      value: '',
+      testId: 'inMaint'
+    })]);
+  });
+  const enableRemoveAndEditItemsDataProvider = [
+    ['Create action CREATE mode', DrawingBoardModes.CREATE ,ServiceInstanceActions.Create, true],
+    ['Create action VIEW mode',DrawingBoardModes.VIEW , ServiceInstanceActions.Create,false],
+    ['Create action RETRY_EDIT mode',DrawingBoardModes.RETRY_EDIT,  ServiceInstanceActions.Create,  true],
+    ['Create action EDIT mode',DrawingBoardModes.EDIT, ServiceInstanceActions.Create,  true],
+    ['Create action RETRY mode',DrawingBoardModes.RETRY, ServiceInstanceActions.Create,  false],
+    ['None action EDIT mode',DrawingBoardModes.EDIT,  ServiceInstanceActions.None, false],
+    ['None action RETRY_EDIT mode', DrawingBoardModes.RETRY_EDIT, ServiceInstanceActions.None, false]];
+  each(enableRemoveAndEditItemsDataProvider).test('shouldShowEditAndDelete if child exist with %s', (description, mode, action, enabled) => {
+    jest.spyOn(store, 'getState').mockReturnValue({
+        global: {
+          drawingBoardStatus: mode
+        }
+      });
+      let node = <any>{
+        data:{
+          action: action
+        },
+      };
+      let res = service.shouldShowRemoveAndEdit(node);
+      expect(res).toBe(enabled);
+    });
+});
+function generateService() {
+  return {
+    "vnfs": {
+      "2017-488_ADIOD-vPE 0": {
+        "inMaint": false,
+        "rollbackOnFailure": "true",
+        "originalName": "2017-488_ADIOD-vPE 0",
+        "isMissingData": false,
+        "trackById": "stigekyxrqi",
+        "vfModules": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+            "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0gytfi": {
+              "isMissingData": false,
+              "sdncPreReload": null,
+              "modelInfo": {
+                "modelType": "VFmodule",
+                "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                "modelVersion": "5",
+                "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"
+              },
+              "instanceParams": [{}],
+              "trackById": "3oj23o7nupo"
+            }
+          }
+        },
+        "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+        "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+        "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+        "lcpCloudRegionId": "JANET25",
+        "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+        "lineOfBusiness": "ONAP",
+        "platformName": "xxx1",
+        "modelInfo": {
+          "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+          "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+          "modelName": "2017-488_ADIOD-vPE",
+          "modelVersion": "5.0",
+          "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+          "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+          "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+        },
+        "legacyRegion": "11111111",
+        "instanceParams": [{}]
+      },
+      "2017-388_ADIOD-vPE 0": {
+        "inMaint": false,
+        "rollbackOnFailure": "true",
+        "originalName": "2017-388_ADIOD-vPE 0",
+        "isMissingData": false,
+        "trackById": "nib719t5vca",
+        "vfModules": {},
+        "vnfStoreKey": "2017-388_ADIOD-vPE 0",
+        "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+        "lcpCloudRegionId": "JANET25",
+        "legacyRegion": "11111",
+        "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+        "platformName": "platform",
+        "lineOfBusiness": "zzz1",
+        "instanceParams": [{}],
+        "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",
+          "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+        },
+        "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+      },
+      "2017-388_ADIOD-vPE 1": {
+        "inMaint": false,
+        "rollbackOnFailure": "true",
+        "originalName": "2017-388_ADIOD-vPE 1",
+        "isMissingData": false,
+        "trackById": "cv7l1ak8vpe",
+        "vfModules": {},
+        "vnfStoreKey": "2017-388_ADIOD-vPE 1",
+        "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+        "lcpCloudRegionId": "JANET25",
+        "legacyRegion": "123",
+        "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+        "platformName": "platform",
+        "lineOfBusiness": "ONAP",
+        "instanceParams": [{}],
+        "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",
+          "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413"
+        },
+        "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413"
+      }
+    },
+    "instanceParams": [{}],
+    "validationCounter": 0,
+    "existingNames": {"yoav": ""},
+    "existingVNFCounterMap": {
+      "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1,
+      "afacccf6-397d-45d6-b5ae-94c39734b168": 1,
+      "0903e1c0-8e03-4936-b5c2-260653b96413": 1
+    },
+    "existingVnfGroupCounterMap": {
+      "daeb6568-cef8-417f-9075-ed259ce59f48": 0,
+      "c2b300e6-45de-4e5e-abda-3032bee2de56": -1
+    },
+    "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 1},
+    "networks": {
+      "ExtVL 0": {
+        "inMaint": false,
+        "rollbackOnFailure": "true",
+        "originalName": "ExtVL 0",
+        "isMissingData": false,
+        "trackById": "s6okajvv2n8",
+        "networkStoreKey": "ExtVL 0",
+        "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+        "lcpCloudRegionId": "JANET25",
+        "legacyRegion": "12355555",
+        "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+        "platformName": "platform",
+        "lineOfBusiness": null,
+        "instanceParams": [{}],
+        "modelInfo": {
+          "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+          "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+          "modelName": "ExtVL",
+          "modelVersion": "37.0",
+          "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+          "modelCustomizationName": "ExtVL 0",
+          "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+        },
+        "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+      }
+    },
+    "vnfGroups": {
+      "groupingservicefortest..ResourceInstanceGroup..0": {
+        "inMaint": false,
+        "rollbackOnFailure": "true",
+        "originalName": "groupingservicefortest..ResourceInstanceGroup..0",
+        "isMissingData": false,
+        "trackById": "se0obn93qq",
+        "vnfGroupStoreKey": "groupingservicefortest..ResourceInstanceGroup..0",
+        "instanceName": "groupingservicefortestResourceInstanceGroup0",
+        "instanceParams": [{}],
+        "modelInfo": {
+          "modelInvariantId": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
+          "modelVersionId": "daeb6568-cef8-417f-9075-ed259ce59f48",
+          "modelName": "groupingservicefortest..ResourceInstanceGroup..0",
+          "modelVersion": "1",
+          "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
+          "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+        },
+        "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+      }
+    },
+    "instanceName": "yoav",
+    "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "subscriptionServiceType": "TYLER SILVIA",
+    "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+    "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+    "lcpCloudRegionId": "JANET25",
+    "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+    "aicZoneId": "ATL53",
+    "pause": null,
+    "projectName": "WATKINS",
+    "rollbackOnFailure": "true",
+    "bulkSize": 1,
+    "aicZoneName": "AAIATLTE-ATL53",
+    "owningEntityName": "WayneHolland",
+    "testApi": "VNF_API",
+    "isEcompGeneratedNaming": false,
+    "tenantName": "USP-SIP-IC-24335-T-01",
+    "modelInfo": {
+      "modelInvariantId": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+      "modelVersionId": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+      "modelName": "action-data",
+      "modelVersion": "1.0",
+      "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"
+    },
+    "isALaCarte": false,
+    "name": "action-data",
+    "version": "1.0",
+    "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
+    "category": "Network L1-3",
+    "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+    "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+    "serviceType": "pnf",
+    "serviceRole": "Testing",
+    "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"},
+    "isMultiStepDesign": true
+  };
+}
+
+function getStore() {
+  return {
+    "global": {
+      "name": null,
+      "flags": {
+        "CREATE_INSTANCE_TEST": false,
+        "EMPTY_DRAWING_BOARD_TEST": false,
+        "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+        "FLAG_ASYNC_INSTANTIATION": true,
+        "FLAG_ASYNC_JOBS": true,
+        "FLAG_ADD_MSO_TESTAPI_FIELD": true,
+        "FLAG_UNASSIGN_SERVICE": true,
+        "FLAG_SERVICE_MODEL_CACHE": true,
+        "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+        "FLAG_SHOW_ASSIGNMENTS": true,
+        "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+        "FLAG_DUPLICATE_VNF": true,
+        "FLAG_DEFAULT_VNF": true,
+        "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
+        "FLAG_A_LA_CARTE_AUDIT_INFO": true,
+        "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": true,
+        "FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS": true,
+        "FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE": true,
+        "FLAG_1902_NEW_VIEW_EDIT": true,
+        "FLAG_1810_IDENTIFY_SERVICE_FOR_NEW_UI": false,
+        "FLAG_1902_VNF_GROUPING": true,
+        "FLAG_SHOW_VERIFY_SERVICE": true,
+        "FLAG_ASYNC_ALACARTE_VFMODULE": true,
+        "FLAG_ASYNC_ALACARTE_VNF": true,
+        "FLAG_SHIFT_VFMODULE_PARAMS_TO_VNF": true,
+        "FLAG_1810_AAI_LOCAL_CACHE": true,
+        "FLAG_EXP_USE_DEFAULT_HOST_NAME_VERIFIER": false,
+        "FLAG_EXP_ANY_ALACARTE_NEW_INSTANTIATION_UI": false,
+        "FLAG_SUPPLEMENTARY_FILE": true,
+        "FLAG_5G_IN_NEW_INSTANTIATION_UI": true,
+        "FLAG_RESTRICTED_SELECT": false,
+        "FLAG_1810_CR_LET_SELECTING_COLLECTOR_TYPE_UNCONDITIONALLY": true
+      },
+      "drawingBoardStatus": "VIEW",
+      "type": "UPDATE_DRAWING_BOARD_STATUS"
+    },
+    "service": {
+      "serviceHierarchy": {
+        "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+          "service": {
+            "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+            "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+            "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": {},
+            "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"}
+          },
+          "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": "10.0.0.10",
+                "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": "10.0.0.10",
+                "is_AVPN_service": "false",
+                "vmx_RSG_name": "vREXI-affinity",
+                "vmx_int_ctl_forwarding": "l2",
+                "vmxvre_oam_ip_0": "10.0.0.10",
+                "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}",
+                "multi_stage_design": "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": "10.0.0.10",
+                "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.0.0.10",
+                "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": "10.0.0.10",
+                "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": "10.0.0.10",
+                "is_AVPN_service": "false",
+                "vmx_RSG_name": "vREXI-affinity",
+                "vmx_int_ctl_forwarding": "l2",
+                "vmxvre_oam_ip_0": "10.0.0.10",
+                "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}",
+                "multi_stage_design": "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": "10.0.0.10",
+                "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.0.0.10",
+                "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": {
+                "max_instances": 1,
+                "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": "10.0.0.10",
+                "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": "10.0.0.10",
+                "is_AVPN_service": "false",
+                "vmx_RSG_name": "vREXI-affinity",
+                "vmx_int_ctl_forwarding": "l2",
+                "vmxvre_oam_ip_0": "10.0.0.10",
+                "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}",
+                "multi_stage_design": "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": "10.0.0.10",
+                "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.0.0.10",
+                "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",
+                    "baseModule": false
+                  },
+                  "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",
+                    "baseModule": true
+                  },
+                  "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",
+                    "baseModule": false
+                  },
+                  "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",
+                    "baseModule": false
+                  },
+                  "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",
+                    "baseModule": false
+                  },
+                  "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": {},
+          "fabricConfigurations": {},
+          "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": true
+              },
+              "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": false
+              },
+              "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",
+                "baseModule": false
+              },
+              "inputs": {}
+            }
+          },
+          "pnfs": {},
+          "vnfGroups": {
+            "groupingservicefortest..ResourceInstanceGroup..0": {
+              "type": "VnfGroup",
+              "invariantUuid": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
+              "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48",
+              "version": "1",
+              "name": "groupingservicefortest..ResourceInstanceGroup..0",
+              "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
+              "properties": {
+                "contained_resource_type": "VF",
+                "role": "SERVICE-ACCESS",
+                "function": "DATA",
+                "description": "DDD0",
+                "type": "LOAD-GROUP",
+                "ecomp_generated_naming": "true"
+              },
+              "members": {
+                "vdbe_svc_vprs_proxy 0": {
+                  "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+                  "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+                  "description": "A Proxy for Service vDBE_Svc_vPRS",
+                  "name": "vDBE_Svc_vPRS Service Proxy",
+                  "version": "1.0",
+                  "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9",
+                  "inputs": {},
+                  "commands": {},
+                  "properties": {},
+                  "type": "Service Proxy",
+                  "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274",
+                  "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14",
+                  "sourceModelName": "vDBE_Svc_vPRS"
+                }
+              }
+            },
+            "groupingservicefortest..ResourceInstanceGroup..1": {
+              "type": "VnfGroup",
+              "invariantUuid": "a704112d-dbc6-4e56-8d4e-aec57e95ef9a",
+              "uuid": "c2b300e6-45de-4e5e-abda-3032bee2de56",
+              "version": "1",
+              "name": "groupingservicefortest..ResourceInstanceGroup..1",
+              "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..1",
+              "properties": {
+                "contained_resource_type": "VF",
+                "role": "SERVICE-ACCESS",
+                "function": "SIGNALING",
+                "description": "DDD1",
+                "type": "LOAD-GROUP",
+                "ecomp_generated_naming": "true"
+              },
+              "members": {
+                "tsbc0001vm001_svc_proxy 0": {
+                  "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+                  "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+                  "description": "A Proxy for Service tsbc0001vm001_Svc",
+                  "name": "tsbc0001vm001_Svc Service Proxy",
+                  "version": "1.0",
+                  "customizationUuid": "3d814462-30fb-4c62-b997-9aa360d27ead",
+                  "inputs": {},
+                  "commands": {},
+                  "properties": {},
+                  "type": "Service Proxy",
+                  "sourceModelUuid": "28aeb8f6-5620-4148-8bfb-a5fb406f0309",
+                  "sourceModelInvariant": "c989ab9a-33c7-46ec-b521-1b2daef5f047",
+                  "sourceModelName": "tsbc0001vm001_Svc"
+                }
+              }
+            }
+          }
+        },
+        "b75e0d22-05ff-4448-9266-5f0d4e1dbbd6": {
+          "service": {
+            "uuid": "b75e0d22-05ff-4448-9266-5f0d4e1dbbd6",
+            "invariantUuid": "5b9c0f33-eec1-484a-bf77-736a6644d7a8",
+            "name": "Using VID for VoIP Network Instantiations Shani",
+            "version": "1.0",
+            "toscaModelURL": null,
+            "category": "VoIP Call Control",
+            "serviceType": "",
+            "serviceRole": "",
+            "description": "Using VID for VoIP Network Instantiations Shani",
+            "serviceEcompNaming": "true",
+            "instantiationType": "ClientConfig",
+            "inputs": {},
+            "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"}
+          },
+          "vnfs": {},
+          "networks": {
+            "AIC30_CONTRAIL_BASIC 0": {
+              "uuid": "ac815c68-35b7-4ea4-9d04-92d2f844b27c",
+              "invariantUuid": "de01afb5-532b-451d-aac4-ff9ff0644060",
+              "description": "Basic contrail 3.0.x L3 network for AIC 3.x sites. ",
+              "name": "AIC30_CONTRAIL_BASIC",
+              "version": "3.0",
+              "customizationUuid": "e94d61f7-b4b2-489a-a4a7-30b1a1a80daf",
+              "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_scope": "Service",
+                "network_type": "AIC30_CONTRAIL_BASIC",
+                "network_technology": "Contrail",
+                "network_homing": "{ecomp_selected_instance_node_target=false}"
+              },
+              "type": "VL",
+              "modelCustomizationName": "AIC30_CONTRAIL_BASIC 0"
+            }
+          },
+          "collectionResource": {},
+          "configurations": {},
+          "fabricConfigurations": {},
+          "serviceProxies": {},
+          "vfModules": {},
+          "volumeGroups": {},
+          "pnfs": {},
+          "vnfGroups": {}
+        }
+      },
+      "serviceInstance": {
+        "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+          "vnfs": {
+            "2017-488_ADIOD-vPE 0": {
+              "action": "None",
+              "inMaint": false,
+              "rollbackOnFailure": "true",
+              "originalName": "2017-488_ADIOD-vPE 0",
+              "isMissingData": false,
+              "trackById": "stigekyxrqi",
+              "vfModules": {
+                "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                  "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0gytfi": {
+                    "isMissingData": false,
+                    "sdncPreReload": null,
+                    "modelInfo": {
+                      "modelType": "VFmodule",
+                      "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                      "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                      "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                      "modelVersion": "5",
+                      "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                      "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"
+                    },
+                    "instanceParams": [{}],
+                    "trackById": "3oj23o7nupo"
+                  }
+                }
+              },
+              "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+              "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+              "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+              "lcpCloudRegionId": "JANET25",
+              "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+              "lineOfBusiness": "ONAP",
+              "platformName": "xxx1",
+              "modelInfo": {
+                "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+                "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+                "modelName": "2017-488_ADIOD-vPE",
+                "modelVersion": "5.0",
+                "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+                "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+                "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+              },
+              "legacyRegion": "11111111",
+              "instanceParams": [{}]
+            },
+            "2017-388_ADIOD-vPE 0": {
+              "action": "Create",
+              "inMaint": false,
+              "rollbackOnFailure": "true",
+              "originalName": "2017-388_ADIOD-vPE 0",
+              "isMissingData": false,
+              "trackById": "nib719t5vca",
+              "vfModules": {},
+              "vnfStoreKey": "2017-388_ADIOD-vPE 0",
+              "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+              "lcpCloudRegionId": "JANET25",
+              "legacyRegion": "11111",
+              "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+              "platformName": "platform",
+              "lineOfBusiness": "zzz1",
+              "instanceParams": [{}],
+              "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",
+                "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+              },
+              "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+            },
+            "2017-388_ADIOD-vPE 1": {
+              "action": "None",
+              "inMaint": false,
+              "rollbackOnFailure": "true",
+              "originalName": "2017-388_ADIOD-vPE 1",
+              "isMissingData": false,
+              "trackById": "cv7l1ak8vpe",
+              "vfModules": {},
+              "vnfStoreKey": "2017-388_ADIOD-vPE 1",
+              "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+              "lcpCloudRegionId": "JANET25",
+              "legacyRegion": "123",
+              "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+              "platformName": "platform",
+              "lineOfBusiness": "ONAP",
+              "instanceParams": [{}],
+              "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",
+                "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413"
+              },
+              "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413"
+            }
+          },
+          "instanceParams": [{}],
+          "validationCounter": 0,
+          "existingNames": {"yoav": ""},
+          "existingVNFCounterMap": {
+            "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1,
+            "afacccf6-397d-45d6-b5ae-94c39734b168": 1,
+            "0903e1c0-8e03-4936-b5c2-260653b96413": 1
+          },
+          "existingVnfGroupCounterMap": {
+            "daeb6568-cef8-417f-9075-ed259ce59f48": 0,
+            "c2b300e6-45de-4e5e-abda-3032bee2de56": -1
+          },
+          "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 1},
+          "networks": {
+            "ExtVL 0": {
+              "inMaint": false,
+              "rollbackOnFailure": "true",
+              "originalName": "ExtVL 0",
+              "isMissingData": false,
+              "trackById": "s6okajvv2n8",
+              "networkStoreKey": "ExtVL 0",
+              "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+              "lcpCloudRegionId": "JANET25",
+              "legacyRegion": "12355555",
+              "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+              "platformName": "platform",
+              "lineOfBusiness": null,
+              "instanceParams": [{}],
+              "modelInfo": {
+                "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                "modelName": "ExtVL",
+                "modelVersion": "37.0",
+                "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                "modelCustomizationName": "ExtVL 0",
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              },
+              "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+            }
+          },
+          "vnfGroups": {
+            "groupingservicefortest..ResourceInstanceGroup..0": {
+              "inMaint": false,
+              "rollbackOnFailure": "true",
+              "originalName": "groupingservicefortest..ResourceInstanceGroup..0",
+              "isMissingData": false,
+              "trackById": "se0obn93qq",
+              "vnfGroupStoreKey": "groupingservicefortest..ResourceInstanceGroup..0",
+              "instanceName": "groupingservicefortestResourceInstanceGroup0",
+              "instanceParams": [{}],
+              "modelInfo": {
+                "modelInvariantId": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
+                "modelVersionId": "daeb6568-cef8-417f-9075-ed259ce59f48",
+                "modelName": "groupingservicefortest..ResourceInstanceGroup..0",
+                "modelVersion": "1",
+                "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
+                "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+              },
+              "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+            }
+          },
+          "instanceName": "yoav",
+          "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "subscriptionServiceType": "TYLER SILVIA",
+          "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+          "productFamilyId": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+          "lcpCloudRegionId": "JANET25",
+          "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+          "aicZoneId": "ATL53",
+          "pause": null,
+          "projectName": "WATKINS",
+          "rollbackOnFailure": "true",
+          "bulkSize": 1,
+          "aicZoneName": "AAIATLTE-ATL53",
+          "owningEntityName": "WayneHolland",
+          "testApi": "VNF_API",
+          "isEcompGeneratedNaming": false,
+          "tenantName": "USP-SIP-IC-24335-T-01",
+          "modelInfo": {
+            "modelInvariantId": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+            "modelVersionId": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+            "modelName": "action-data",
+            "modelVersion": "1.0",
+            "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"
+          },
+          "isALaCarte": false,
+          "name": "action-data",
+          "version": "1.0",
+          "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
+          "category": "Network L1-3",
+          "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+          "invariantUuid": "cdb90b57-ed78-4d44-a5b4-7f43a02ec632",
+          "serviceType": "pnf",
+          "serviceRole": "Testing",
+          "vidNotions": {"instantiationUI": "legacy", "modelCategory": "other", "viewEditUI": "legacy"},
+          "isMultiStepDesign": true
+        }
+      },
+      "lcpRegionsAndTenants": {
+        "lcpRegionList": [{
+          "id": "JANET25",
+          "name": "JANET25 (AIC)",
+          "isPermitted": true,
+          "cloudOwner": "irma-aic"
+        }, {"id": "hvf6", "name": "hvf6 (AIC)", "isPermitted": true, "cloudOwner": "irma-aic"}],
+        "lcpRegionsTenantsMap": {
+          "JANET25": [{
+            "id": "092eb9e8e4b7412e8787dd091bc58e86",
+            "name": "USP-SIP-IC-24335-T-01",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }],
+          "hvf6": [{
+            "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+            "name": "AIN Web Tool-15-D-testalexandria",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "name": "AIN Web Tool-15-D-STTest2",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "1178612d2b394be4834ad77f567c0af2",
+            "name": "AIN Web Tool-15-D-SSPtestcustome",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+            "name": "AIN Web Tool-15-D-UncheckedEcopm",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "de007636e25249238447264a988a927b",
+            "name": "AIN Web Tool-15-D-dfsdf",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "62f29b3613634ca6a3065cbe0e020c44",
+            "name": "AIN/SMS-16-D-Multiservices1",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "649289e30d3244e0b48098114d63c2aa",
+            "name": "AIN Web Tool-15-D-SSPST66",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "3f21eeea6c2c486bba31dab816c05a32",
+            "name": "AIN Web Tool-15-D-ASSPST47",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "f60ce21d3ee6427586cff0d22b03b773",
+            "name": "CESAR-100-D-sspjg67246",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "8774659e425f479895ae091bb5d46560",
+            "name": "CESAR-100-D-sspjg68359",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "624eb554b0d147c19ff8885341760481",
+            "name": "AINWebTool-15-D-iftach",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "214f55f5fc414c678059c383b03e4962",
+            "name": "CESAR-100-D-sspjg612401",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "c90666c291664841bb98e4d981ff1db5",
+            "name": "CESAR-100-D-sspjg621340",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+            "name": "sspjg621351cloned",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "b386b768a3f24c8e953abbe0b3488c02",
+            "name": "AINWebTool-15-D-eteancomp",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "dc6c4dbfd225474e9deaadd34968646c",
+            "name": "AINWebTool-15-T-SPFET",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+            "name": "AINWebTool-15-X-eeweww",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "f2f3830e4c984d45bcd00e1a04158a79",
+            "name": "CESAR-100-D-spjg61909",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "05b91bd5137f4929878edd965755c06d",
+            "name": "CESAR-100-D-sspjg621512cloned",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "7002fbe8482d4a989ddf445b1ce336e0",
+            "name": "AINWebTool-15-X-vdr",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "4008522be43741dcb1f5422022a2aa0b",
+            "name": "AINWebTool-15-D-ssasa",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "f44e2e96a1b6476abfda2fa407b00169",
+            "name": "AINWebTool-15-D-PFNPT",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "b69a52bec8a84669a37a1e8b72708be7",
+            "name": "AINWebTool-15-X-vdre",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "fac7d9fd56154caeb9332202dcf2969f",
+            "name": "AINWebTool-15-X-NONPODECOMP",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "2d34d8396e194eb49969fd61ffbff961",
+            "name": "DN5242-Nov16-T5",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+            "name": "ro-T11",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+            "name": "ro-T112",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+            "name": "DN5242-Nov21-T1",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "d0a3e3f2964542259d155a81c41aadc3",
+            "name": "test-hvf6-09",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }, {
+            "id": "cbb99fe4ada84631b7baf046b6fd2044",
+            "name": "DN5242-Nov16-T3",
+            "isPermitted": true,
+            "cloudOwner": "irma-aic"
+          }]
+        }
+      },
+      "subscribers": [{
+        "id": "ERICA5779-Subscriber-2",
+        "name": "ERICA5779-Subscriber-2",
+        "isPermitted": false
+      }, {
+        "id": "ERICA5779-Subscriber-3",
+        "name": "ERICA5779-Subscriber-3",
+        "isPermitted": false
+      }, {
+        "id": "ERICA5779-Subscriber-4",
+        "name": "ERICA5779-Subscriber-5",
+        "isPermitted": false
+      }, {
+        "id": "ERICA5779-TestSub-PWT-101",
+        "name": "ERICA5779-TestSub-PWT-101",
+        "isPermitted": false
+      }, {
+        "id": "ERICA5779-TestSub-PWT-102",
+        "name": "ERICA5779-TestSub-PWT-102",
+        "isPermitted": false
+      }, {
+        "id": "ERICA5779-TestSub-PWT-103",
+        "name": "ERICA5779-TestSub-PWT-103",
+        "isPermitted": false
+      }, {
+        "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+        "name": "CRAIG/ROBERTS",
+        "isPermitted": false
+      }, {"id": "DHV1707-TestSubscriber-2", "name": "DALE BRIDGES", "isPermitted": false}, {
+        "id": "jimmy-example",
+        "name": "JimmyExampleCust-20161102",
+        "isPermitted": false
+      }, {"id": "jimmy-example2", "name": "JimmyExampleCust-20161103", "isPermitted": false}, {
+        "id": "CAR_2020_ER",
+        "name": "CAR_2020_ER",
+        "isPermitted": true
+      }, {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "name": "Emanuel",
+        "isPermitted": false
+      }, {
+        "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+        "name": "JULIO ERICKSON",
+        "isPermitted": false
+      }, {
+        "id": "DHV1707-TestSubscriber-1",
+        "name": "LLOYD BRIDGES",
+        "isPermitted": false
+      }, {"id": "e433710f-9217-458d-a79d-1c7aff376d89", "name": "SILVIA ROBBINS", "isPermitted": true}],
+      "productFamilies": null,
+      "serviceTypes": {
+        "e433710f-9217-458d-a79d-1c7aff376d89": [{
+          "id": "17",
+          "name": "JOHANNA_SANTOS",
+          "isPermitted": false
+        }, {"id": "16", "name": "LINDSEY", "isPermitted": false}, {
+          "id": "2",
+          "name": "Emanuel",
+          "isPermitted": false
+        }, {"id": "5", "name": "Kennedy", "isPermitted": false}, {
+          "id": "14",
+          "name": "SSD",
+          "isPermitted": false
+        }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, {
+          "id": "12",
+          "name": "VPMS",
+          "isPermitted": false
+        }, {"id": "3", "name": "vJamie", "isPermitted": false}, {
+          "id": "0",
+          "name": "vRichardson",
+          "isPermitted": false
+        }, {"id": "18", "name": "vCarroll", "isPermitted": false}, {
+          "id": "9",
+          "name": "vMME",
+          "isPermitted": false
+        }, {"id": "13", "name": "vMMSC", "isPermitted": false}, {
+          "id": "10",
+          "name": "vMNS",
+          "isPermitted": false
+        }, {"id": "15", "name": "vMOG", "isPermitted": false}, {
+          "id": "8",
+          "name": "vOTA",
+          "isPermitted": false
+        }, {"id": "11", "name": "vSCP", "isPermitted": false}, {
+          "id": "6",
+          "name": "vSEGW",
+          "isPermitted": false
+        }, {"id": "7", "name": "vVM", "isPermitted": false}, {"id": "4", "name": "vVoiceMail", "isPermitted": false}]
+      },
+      "aicZones": [{"id": "ATL53", "name": "AAIATLTE-ATL53"}, {"id": "ABC15", "name": "AAITESAN-ABC15"}, {
+        "id": "TES36",
+        "name": "ABCEETES-TES36"
+      }, {"id": "ATL54", "name": "AICFTAAI-ATL54"}, {"id": "ATL43", "name": "AICLOCID-ATL43"}, {
+        "id": "AMD15",
+        "name": "AMDFAA01-AMD15"
+      }, {"id": "AMF11", "name": "AMDOCS01-AMF11"}, {"id": "RCT1", "name": "AMSTERNL-RCT1"}, {
+        "id": "AMS1",
+        "name": "AMSTNLBW-AMS1"
+      }, {"id": "HJH1", "name": "AOEEQQQD-HJH1"}, {"id": "HJE1", "name": "AOEEWWWD-HJE1"}, {
+        "id": "MCS1",
+        "name": "ASACMAMS-MCS1"
+      }, {"id": "AUG1", "name": "ASDFGHJK-AUG1"}, {"id": "LUC1", "name": "ATLDFGYC-LUC1"}, {
+        "id": "ATL1",
+        "name": "ATLNGAMA-ATL1"
+      }, {"id": "ATL2", "name": "ATLNGANW-ATL2"}, {"id": "HPO1", "name": "ATLNGAUP-HPO1"}, {
+        "id": "ANI1",
+        "name": "ATLNGTRE-ANI1"
+      }, {"id": "ATL44", "name": "ATLSANAB-ATL44"}, {"id": "ATL56", "name": "ATLSANAC-ATL56"}, {
+        "id": "ABC11",
+        "name": "ATLSANAI-ABC11"
+      }, {"id": "ATL34", "name": "ATLSANAI-ATL34"}, {"id": "ATL63", "name": "ATLSANEW-ATL63"}, {
+        "id": "ABC12",
+        "name": "ATLSECIA-ABC12"
+      }, {"id": "AMD18", "name": "AUDIMA01-AMD18"}, {"id": "AVT1", "name": "AVTRFLHD-AVT1"}, {
+        "id": "KIT1",
+        "name": "BHYJFGLN-KIT1"
+      }, {"id": "BHY17", "name": "BHYTFRF3-BHY17"}, {"id": "RTW5", "name": "BHYTFRY4-RTW5"}, {
+        "id": "RTZ4",
+        "name": "BHYTFRZ6-RTZ4"
+      }, {"id": "RTD2", "name": "BHYTFRk4-RTD2"}, {"id": "BNA1", "name": "BNARAGBK-BNA1"}, {
+        "id": "VEL1",
+        "name": "BNMLKUIK-VEL1"
+      }, {"id": "BOT1", "name": "BOTHWAKY-BOT1"}, {"id": "CAL33", "name": "CALIFORN-CAL33"}, {
+        "id": "ATL84",
+        "name": "CANTTCOC-ATL84"
+      }, {"id": "HSD1", "name": "CHASKCDS-HSD1"}, {"id": "CHI1", "name": "CHILLIWE-CHI1"}, {
+        "id": "XCP12",
+        "name": "CHKGH123-XCP12"
+      }, {"id": "JNL1", "name": "CJALSDAC-JNL1"}, {"id": "KJN1", "name": "CKALDKSA-KJN1"}, {
+        "id": "CLG1",
+        "name": "CLGRABAD-CLG1"
+      }, {"id": "CKL1", "name": "CLKSKCKK-CKL1"}, {"id": "ATL66", "name": "CLLIAAII-ATL66"}, {
+        "id": "CQK1",
+        "name": "CQKSCAKK-CQK1"
+      }, {"id": "CWY1", "name": "CWYMOWBS-CWY1"}, {"id": "DKJ1", "name": "DKJSJDKA-DKJ1"}, {
+        "id": "DSF45",
+        "name": "DSFBG123-DSF45"
+      }, {"id": "DSL12", "name": "DSLFK242-DSL12"}, {"id": "FDE55", "name": "FDERT555-FDE55"}, {
+        "id": "VEN2",
+        "name": "FGHJUHIL-VEN2"
+      }, {"id": "ATL64", "name": "FORLOAAJ-ATL64"}, {"id": "GNV1", "name": "GNVLSCTL-GNV1"}, {
+        "id": "SAN22",
+        "name": "GNVLSCTL-SAN22"
+      }, {"id": "KAP1", "name": "HIOUYTRQ-KAP1"}, {"id": "LIS1", "name": "HOSTPROF-LIS1"}, {
+        "id": "HRG1",
+        "name": "HRGHRGGS-HRG1"
+      }, {"id": "HST25", "name": "HSTNTX01-HST25"}, {"id": "STN27", "name": "HSTNTX01-STN27"}, {
+        "id": "HST70",
+        "name": "HSTNTX70-HST70"
+      }, {"id": "KOR1", "name": "HYFLNBVT-KOR1"}, {"id": "RAD10", "name": "INDIPUNE-RAD10"}, {
+        "id": "REL1",
+        "name": "INGERFGT-REL1"
+      }, {"id": "JAD1", "name": "JADECLLI-JAD1"}, {"id": "HKA1", "name": "JAKHLASS-HKA1"}, {
+        "id": "JCS1",
+        "name": "JCSJSCJS-JCS1"
+      }, {"id": "JCV1", "name": "JCVLFLBW-JCV1"}, {"id": "KGM2", "name": "KGMTNC20-KGM2"}, {
+        "id": "KJF12",
+        "name": "KJFDH123-KJF12"
+      }, {"id": "JGS1", "name": "KSJKKKKK-JGS1"}, {"id": "LAG1", "name": "LARGIZON-LAG1"}, {
+        "id": "LAG1a",
+        "name": "LARGIZON-LAG1a"
+      }, {"id": "LAG45", "name": "LARGIZON-LAG1a"}, {"id": "LAG1b", "name": "LARGIZON-LAG1b"}, {
+        "id": "WAN1",
+        "name": "LEIWANGW-WAN1"
+      }, {"id": "DSA1", "name": "LKJHGFDS-DSA1"}, {"id": "LON1", "name": "LONEENCO-LON1"}, {
+        "id": "SITE",
+        "name": "LONEENCO-SITE"
+      }, {"id": "ZXL1", "name": "LWLWCANN-ZXL1"}, {"id": "MTN20", "name": "MDTWNJ21-MTN20"}, {
+        "id": "MTN32",
+        "name": "MDTWNJ21-MTN32"
+      }, {"id": "AMD13", "name": "MEMATLAN-AMD13"}, {"id": "MIC54", "name": "MICHIGAN-MIC54"}, {
+        "id": "MAR1",
+        "name": "MNBVCXZM-MAR1"
+      }, {"id": "NCA1", "name": "NCANCANN-NCA1"}, {"id": "NFT1", "name": "NFTJSSSS-NFT1"}, {
+        "id": "GAR1",
+        "name": "NGFVSJKO-GAR1"
+      }, {"id": "NYC1", "name": "NYCMNY54-NYC1"}, {"id": "OKC1", "name": "OKCBOK55-OKC1"}, {
+        "id": "OLG1",
+        "name": "OLHOLHOL-OLG1"
+      }, {"id": "OLK1", "name": "OLKOLKLS-OLK1"}, {"id": "NIR1", "name": "ORFLMANA-NIR1"}, {
+        "id": "JAN1",
+        "name": "ORFLMATT-JAN1"
+      }, {"id": "ORL1", "name": "ORLDFLMA-ORL1"}, {"id": "PAR1", "name": "PARSFRCG-PAR1"}, {
+        "id": "PBL1",
+        "name": "PBLAPBAI-PBL1"
+      }, {"id": "mac10", "name": "PKGTESTF-mac10"}, {"id": "mac20", "name": "PKGTESTF-mac20"}, {
+        "id": "TIR2",
+        "name": "PLKINHYI-TIR2"
+      }, {"id": "IBB1", "name": "PLMKOIJU-IBB1"}, {"id": "COM1", "name": "PLMKOPIU-COM1"}, {
+        "id": "POI1",
+        "name": "PLMNJKIU-POI1"
+      }, {"id": "PLT1", "name": "PLTNCA60-PLT1"}, {"id": "POI22", "name": "POIUY123-POI22"}, {
+        "id": "DCC1",
+        "name": "POIUYTGH-DCC1"
+      }, {"id": "DCC1a", "name": "POIUYTGH-DCC1a"}, {"id": "DCC1b", "name": "POIUYTGH-DCC1b"}, {
+        "id": "DCC2",
+        "name": "POIUYTGH-DCC2"
+      }, {"id": "DCC3", "name": "POIUYTGH-DCC3"}, {"id": "IAA1", "name": "QAZXSWED-IAA1"}, {
+        "id": "QWE1",
+        "name": "QWECLLI1-QWE1"
+      }, {"id": "NUM1", "name": "QWERTYUI-NUM1"}, {"id": "RAD1", "name": "RADICAL1-RAD1"}, {
+        "id": "RJN1",
+        "name": "RJNRBZAW-RJN1"
+      }, {"id": "SAA13", "name": "SAIT1AA9-SAA13"}, {"id": "SAA14", "name": "SAIT1AA9-SAA14"}, {
+        "id": "SDD81",
+        "name": "SAIT1DD6-SDD81"
+      }, {"id": "SDD82", "name": "SAIT1DD9-SDD82"}, {"id": "SAA11", "name": "SAIT9AA2-SAA11"}, {
+        "id": "SAA80",
+        "name": "SAIT9AA3-SAA80"
+      }, {"id": "SAA12", "name": "SAIT9AF8-SAA12"}, {"id": "SCC80", "name": "SAIT9CC3-SCC80"}, {
+        "id": "ATL75",
+        "name": "SANAAIRE-ATL75"
+      }, {"id": "ICC1", "name": "SANJITAT-ICC1"}, {"id": "SCK1", "name": "SCKSCKSK-SCK1"}, {
+        "id": "EHH78",
+        "name": "SDCSHHH5-EHH78"
+      }, {"id": "SAA78", "name": "SDCTAAA1-SAA78"}, {"id": "SAX78", "name": "SDCTAXG1-SAX78"}, {
+        "id": "SBX78",
+        "name": "SDCTBXG1-SBX78"
+      }, {"id": "SEE78", "name": "SDCTEEE4-SEE78"}, {"id": "SGG78", "name": "SDCTGGG1-SGG78"}, {
+        "id": "SXB78",
+        "name": "SDCTGXB1-SXB78"
+      }, {"id": "SJJ78", "name": "SDCTJJJ1-SJJ78"}, {"id": "SKK78", "name": "SDCTKKK1-SKK78"}, {
+        "id": "SLF78",
+        "name": "SDCTLFN1-SLF78"
+      }, {"id": "SLL78", "name": "SDCTLLL1-SLL78"}, {"id": "MAD11", "name": "SDFQWGKL-MAD11"}, {
+        "id": "HGD1",
+        "name": "SDFQWHGD-HGD1"
+      }, {"id": "SBB78", "name": "SDIT1BBB-SBB78"}, {"id": "SDG78", "name": "SDIT1BDG-SDG78"}, {
+        "id": "SBU78",
+        "name": "SDIT1BUB-SBU78"
+      }, {"id": "SHH78", "name": "SDIT1HHH-SHH78"}, {"id": "SJU78", "name": "SDIT1JUB-SJU78"}, {
+        "id": "SNA1",
+        "name": "SNANTXCA-SNA1"
+      }, {"id": "SAM1", "name": "SNDGCA64-SAN1"}, {"id": "SNG1", "name": "SNGPSIAU-SNG1"}, {
+        "id": "SSA56",
+        "name": "SSIT2AA7-SSA56"
+      }, {"id": "STG1", "name": "STTGGE62-STG1"}, {"id": "STT1", "name": "STTLWA02-STT1"}, {
+        "id": "SYD1",
+        "name": "SYDNAUBV-SYD1"
+      }, {"id": "ATL99", "name": "TEESTAAI-ATL43"}, {"id": "ATL98", "name": "TEESTAAI-ATL43"}, {
+        "id": "ATL76",
+        "name": "TELEPAAI-ATL76"
+      }, {"id": "ABC14", "name": "TESAAISA-ABC14"}, {"id": "TAT33", "name": "TESAAISA-TAT33"}, {
+        "id": "TAT34",
+        "name": "TESAAISB-TAT34"
+      }, {"id": "TAT37", "name": "TESAAISD-TAT37"}, {"id": "ATL62", "name": "TESSASCH-ATL62"}, {
+        "id": "TLP1",
+        "name": "TLPNXM18-TLP1"
+      }, {"id": "SAN13", "name": "TOKYJPFA-SAN13"}, {"id": "TOK1", "name": "TOKYJPFA-TOK1"}, {
+        "id": "TOL1",
+        "name": "TOLDOH21-TOL1"
+      }, {"id": "TOR1", "name": "TOROONXN-TOR1"}, {"id": "TOY1", "name": "TORYONNZ-TOY1"}, {
+        "id": "ATL35",
+        "name": "TTESSAAI-ATL35"
+      }, {"id": "TUF1", "name": "TUFCLLI1-TUF1"}, {"id": "SAI1", "name": "UBEKQLPD-SAI1"}, {
+        "id": "UUU4",
+        "name": "UUUAAAUU-UUU4"
+      }, {"id": "YYY1", "name": "UUUAIAAI-YYY1"}, {"id": "BAN1", "name": "VSDKYUTP-BAN1"}, {
+        "id": "WAS1",
+        "name": "WASHDCSW-WAS1"
+      }, {"id": "APP1", "name": "WBHGTYUI-APP1"}, {"id": "SUL2", "name": "WERTYUJK-SUL2"}, {
+        "id": "DEF2",
+        "name": "WSBHGTYL-DEF2"
+      }, {"id": "DHA12", "name": "WSXEDECF-DHA12"}, {"id": "MNT11", "name": "WSXEFBTH-MNT11"}, {
+        "id": "RAJ1",
+        "name": "YGBIJNLQ-RAJ1"
+      }, {"id": "JAG1", "name": "YUDFJULP-JAG1"}, {"id": "ZEN1", "name": "ZENCLLI1-ZEN1"}, {
+        "id": "ZOG1",
+        "name": "ZOGASTRO-ZOG1"
+      }, {"id": "SDE1", "name": "ZXCVBNMA-SDE1"}, {"id": "SIP1", "name": "ZXCVBNMK-SIP1"}, {
+        "id": "JUL1",
+        "name": "ZXCVBNMM-JUL1"
+      }, {"id": "ERT1", "name": "ertclli1-ERT1"}, {"id": "IOP1", "name": "iopclli1-IOP1"}, {
+        "id": "OPA1",
+        "name": "opaclli1-OPA1"
+      }, {"id": "RAI1", "name": "poiuytre-RAI1"}, {"id": "PUR1", "name": "purelyde-PUR1"}, {
+        "id": "RTY1",
+        "name": "rtyclli1-RTY1"
+      }, {"id": "SDF1", "name": "sdfclli1-SDF1"}, {"id": "SSW56", "name": "ss8126GT-SSW56"}, {
+        "id": "UIO1",
+        "name": "uioclli1-UIO1"
+      }],
+      "categoryParameters": {
+        "owningEntityList": [{
+          "id": "aaa1",
+          "name": "aaa1"
+        }, {"id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "name": "WayneHolland"}, {
+          "id": "Melissa",
+          "name": "Melissa"
+        }],
+        "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}],
+        "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}],
+        "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}]
+      },
+      "type": "UPDATE_LCP_REGIONS_AND_TENANTS"
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.ts
new file mode 100644 (file)
index 0000000..5a023d5
--- /dev/null
@@ -0,0 +1,278 @@
+import {Injectable} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../shared/store/reducers";
+import {ServiceInstanceActions} from "../../../shared/models/serviceInstanceActions";
+import {MessageBoxData} from "../../../shared/components/messageBox/messageBox.data";
+import {MessageBoxService} from "../../../shared/components/messageBox/messageBox.service";
+import * as _ from "lodash";
+import {DrawingBoardModes} from "../drawing-board.modes";
+import {AuditInfoModalComponent} from "../../../shared/components/auditInfoModal/auditInfoModal.component";
+import {VnfModelInfo} from "./models/vnf/vnf.model.info";
+import {ILevelNodeInfo} from "./models/basic.model.info";
+
+@Injectable()
+export class SharedTreeService {
+  private _sharedTreeService: SharedTreeService;
+  constructor(private _store: NgRedux<AppState>) {
+  }
+
+  /***********************************************************
+   * return if instance has missing data
+   * @param instance - vnf instance
+   * @param dynamicInputs - from the instance
+   * @param isEcompGeneratedNaming
+   ************************************************************/
+  selectedVNF: string = null;
+
+
+  getSelectedVNF(): string {
+    return this.selectedVNF;
+  }
+
+  setSelectedVNF(node): void {
+    if (_.isNil(node) || node.data.type !== 'VF') {
+      this.selectedVNF = null;
+    } else {
+      this.selectedVNF = node.data.vnfStoreKey;
+    }
+  }
+
+  hasMissingData(instance, dynamicInputs: any, isEcompGeneratedNaming: boolean, requiredFields: string[]): boolean {
+    if (!isEcompGeneratedNaming && _.isEmpty(instance.instanceName)) {
+      return true;
+    }
+
+    for (let field of requiredFields) {
+      if (_.isEmpty(instance[field])) {
+        return true;
+      }
+    }
+
+    for (let field of dynamicInputs) {
+      if (field.isRequired && !_.isNil(instance.instanceParams) && _.isEmpty(instance.instanceParams[0][field.id])) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+
+  addingStatusProperty(node) {
+    node['statusProperties'] = [];
+    node['statusProperties'].push({key: 'Prov Status:', value: node.provStatus, testId: 'provStatus'});
+    node['statusProperties'].push({key: 'Orch Status:', value: node.orchStatus, testId: 'orchStatus'});
+    if (node.inMaint) {
+      node['statusProperties'].push({key: 'In-maintenance', value: '', testId: 'inMaint'});
+    }
+    return node;
+  }
+
+  /**********************************************
+   * should delete or remove child instance's
+   "new" -> should remove
+   !new" -> should change action status
+   **********************************************/
+  removeDeleteAllChild(node, serviceModelId: string, callback): void {
+    for (let nodeChild of node.children) {
+      if (nodeChild.data.action === ServiceInstanceActions.Create) {
+        if (!_.isNil(nodeChild.data) && !_.isNil(nodeChild.data.menuActions) && !_.isNil(nodeChild.data.menuActions['remove'])) {
+          nodeChild.data.menuActions['remove']['method'](nodeChild, serviceModelId);
+        }
+      } else {
+        if (!_.isNil(nodeChild.data) && !_.isNil(nodeChild.data.menuActions) && !_.isNil(nodeChild.data.menuActions['delete'])) {
+          nodeChild.data.menuActions['delete']['method'](nodeChild, serviceModelId);
+        }
+      }
+    }
+    callback(node, serviceModelId);
+  }
+
+
+  /**********************************************
+   * should undo delete child instance's
+   **********************************************/
+  undoDeleteAllChild(node, serviceModelId: string, callback): void {
+    for (let nodeChild of node.children) {
+      if (!_.isNil(nodeChild.data) && !_.isNil(nodeChild.data.menuActions) && !_.isNil(nodeChild.data.menuActions['undoDelete'])) {
+        nodeChild.data.menuActions['undoDelete']['method'](nodeChild, serviceModelId);
+      }
+    }
+    callback(node, serviceModelId);
+  }
+
+  /**********************************************
+   * should return true if can delete
+   **********************************************/
+  shouldShowDelete(node): boolean {
+    const mode = this._store.getState().global.drawingBoardStatus;
+    if (!_.isNil(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && !_.isNil(node.data.menuActions['delete'])) {
+      if (mode !== DrawingBoardModes.EDIT || node.data.action === ServiceInstanceActions.Create) {
+        return false;
+      } else if (node.data.action === ServiceInstanceActions.None) {
+        return true
+      }
+      return false;
+    }
+    return false;
+  }
+
+  /**********************************************
+   * should return true if can undo delete
+   **********************************************/
+  shouldShowUndoDelete(node): boolean {
+    const mode = this._store.getState().global.drawingBoardStatus;
+    if (mode === DrawingBoardModes.EDIT && !_.isNil(node.data.action) && !_.isNil(node.data.menuActions['undoDelete'])) {
+      if (node.data.action === ServiceInstanceActions.Create || node.data.action === ServiceInstanceActions.Delete) {
+        return false;
+      } else if (node.data.action.split('_').pop() === 'Delete') {
+        return true
+      }
+      return false;
+    }
+    return false;
+  }
+  /**********************************************
+   * should return true if can remove or edit
+   * enabled only on edit/design mode and for new instances
+   **********************************************/
+  shouldShowRemoveAndEdit(node): boolean {
+    const mode = this._store.getState().global.drawingBoardStatus;
+    if (!_.isNil(node) && !_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action === ServiceInstanceActions.Create &&
+      mode !== DrawingBoardModes.VIEW && mode !== DrawingBoardModes.RETRY) {
+      return true;
+    }
+    return false;
+  }
+  /**********************************************
+   * should return true if can duplicate by mode
+   **********************************************/
+  shouldShowDuplicate(node): boolean {
+    const mode = this._store.getState().global.drawingBoardStatus;
+    return !mode.includes('RETRY');
+  }
+
+  /**********************************************
+   * should return true if can audit info
+   **********************************************/
+  shouldShowAuditInfo(node): boolean {
+    return this.isRetryMode() || (!_.isNil(node.data) && !_.isNil(node.data.action) && node.data.action !== ServiceInstanceActions.Create);
+  }
+
+
+  isRetryMode(): boolean {
+    const mode = this._store.getState().global.drawingBoardStatus;
+    return mode.includes('RETRY');
+  }
+
+
+  /**********************************************
+   * should return true if can add node instances
+   **********************************************/
+  shouldShowAddIcon(): boolean{
+    const mode = this._store.getState().global.drawingBoardStatus;
+    return mode === DrawingBoardModes.EDIT || mode=== DrawingBoardModes.CREATE;
+  }
+  /************************************************
+   return number of instances with action Delete
+   @type: vnfs networks, vngGroups (not vfModule)
+   @node : node model from the left tree
+   ************************************************/
+  getExistingInstancesWithDeleteMode(node, serviceModelId: string, type: string): number {
+    let counter = 0;
+    const existingInstances = this._store.getState().service.serviceInstance[serviceModelId][type];
+    const modelUniqueId = node.data.modelUniqueId;
+    if (!_.isNil(existingInstances)) {
+      for (let instanceKey in existingInstances) {
+        if (!_.isNil(existingInstances[instanceKey].action)) {
+          if (existingInstances[instanceKey].modelInfo.modelUniqueId === modelUniqueId && existingInstances[instanceKey].action.split('_').pop() === 'Delete') {
+            counter++;
+          }
+        }
+      }
+    }
+    return counter;
+  }
+
+
+  isServiceOnDeleteMode(serviceId: string): boolean {
+    return this._store.getState().service.serviceInstance[serviceId].action === ServiceInstanceActions.Delete;
+  }
+
+
+  openModal(node : any | any[] , serviceModelId : string, cb : Function) : void {
+    let type: string = _.isArray(node) ? 'Service' : node.data.typeName;
+    let messageBoxData: MessageBoxData = new MessageBoxData(
+      "Mark for Delete",
+      `You are about to mark for delete this ${type} this will also mark all its children and remove all new instances just added`,
+      <any>"warning",
+      <any>"md",
+      [
+        {
+          text: "Mark and remove",
+          size: "large",
+          callback: cb.bind(this, node, serviceModelId),
+          closeModal: true
+        },
+        {text: "Don’t Remove", size: "medium", closeModal: true}
+      ]);
+
+    MessageBoxService.openModal.next(messageBoxData);
+  }
+
+  someChildHasCreateAction(nodes: any | any[]) : boolean {
+    let nodesArr = _.isArray(nodes) ? nodes : [nodes];
+    for(const node of nodesArr){
+      if(node.action === ServiceInstanceActions.Create) {return true;}
+      if(node.children){
+        for (let nodeChild of node.children) {
+          if (nodeChild.action === ServiceInstanceActions.Create) {
+            return true;
+          }
+          if(nodeChild.children && nodeChild.children.length > 0){
+            for(let child of nodeChild.children){
+              let hasCreateAction = this.someChildHasCreateAction(child);
+              if(hasCreateAction) {
+                return true;
+              }
+            }
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  shouldShowDeleteInstanceWithChildrenModal(node : any | any[] , serviceModelId : string, cb : Function) : void {
+    if(this.someChildHasCreateAction(node)){
+      this.openModal(node , serviceModelId, cb);
+    }else {
+      cb(node, serviceModelId)
+    }
+  }
+
+
+  isFailed(node): boolean {
+    return !_.isNil(node.data) ? node.data.isFailed : false;
+  }
+
+  /************************************************
+   in a case the node is failed e.g. not instantiated correctly
+   the function will call to openRetryInstanceAuditInfoModal
+   @node : node model from the left tree
+   @serviceModelId : serviceModelId
+   @instance : instance
+   @instanceType: instanceType
+   @modelInfoService : the model (vnf, vfmodule, network, vnfgroup)object that call to the function (this)
+   ************************************************/
+  openAuditInfoModal(node, serviceModelId, instance, instanceType, modelInfoService : ILevelNodeInfo){
+    let isInstanceFailed  = this.isFailed(node);
+      AuditInfoModalComponent.openInstanceAuditInfoModal.next({
+        instanceId: serviceModelId,
+        type: instanceType,
+        model: modelInfoService.getModel(node.data.modelName, instance, this._store.getState().service.serviceHierarchy[serviceModelId]),
+        instance,
+        isInstanceFailed,
+        trackById: instance.trackById
+      });
+    }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.html
new file mode 100644 (file)
index 0000000..0222b80
--- /dev/null
@@ -0,0 +1,8 @@
+<div class="search-container">
+  <sdc-filter-bar
+    [placeHolder]="'Search...'"
+    [debounceTime]="250"
+    [testId]="inputTestId"
+    (valueChange)="searchTree($event)">
+  </sdc-filter-bar>
+</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.scss
new file mode 100644 (file)
index 0000000..5d99962
--- /dev/null
@@ -0,0 +1,3 @@
+.search-container {
+  min-width: 40px;
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.spec.ts
new file mode 100644 (file)
index 0000000..754dd66
--- /dev/null
@@ -0,0 +1,93 @@
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule} from '@angular/common/http/testing';
+import {CUSTOM_ELEMENTS_SCHEMA} from "@angular/core";
+import {SearchComponent} from "./search.component";
+import {FormsModule, ReactiveFormsModule} from "@angular/forms";
+
+describe('Spinner component', () => {
+
+  let component: SearchComponent;
+  let fixture: ComponentFixture<SearchComponent>;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [FormsModule, ReactiveFormsModule, HttpClientTestingModule],
+      providers: [],
+      declarations: [SearchComponent],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA]
+    });
+    await TestBed.compileComponents();
+
+    fixture = TestBed.createComponent(SearchComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+
+  })().then(done).catch(done.fail));
+
+
+  test('component should be defined', () => {
+    expect(component).toBeDefined();
+  });
+
+  test('searchTree should return all nodes that include some text: with text', () => {
+    component.nodes = [
+      {
+        name: 'name_1'
+      },
+      {
+        name: 'name_2'
+      },
+      {
+        name: 'name_3'
+      },
+      {
+        name: 'name_3'
+      }];
+    jest.spyOn(component.updateNodes, 'emit');
+    spyOn(component, 'expandParentByNodeId').and.stub();
+    component.searchTree('name_1');
+
+    expect(component.updateNodes.emit).toHaveBeenCalledWith({
+      nodes: [
+        {
+          name: 'name_1'
+        },
+        {
+          name: 'name_2'
+        },
+        {
+          name: 'name_3'
+        },
+        {
+          name: 'name_3'
+        }],
+      filterValue: 'name_1'
+    });
+  });
+
+  test('searchTree should return all nodes that include some text: without text', () => {
+    component.nodes = [
+      {
+        name: 'name_1',
+        children: [
+          {
+            name: 'name_child_1'
+          }
+        ]
+      },
+      {
+        name: 'name_2'
+      },
+      {
+        name: 'name_3'
+      },
+      {
+        name: 'name_4'
+      }];
+    jest.spyOn(component.updateNodes, 'emit');
+    spyOn(component, 'expandParentByNodeId').and.stub();
+    component.searchTree('');
+
+    expect(component.updateNodes.emit).toHaveBeenCalled();
+  });
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/search/search.component.ts
new file mode 100644 (file)
index 0000000..19edbcd
--- /dev/null
@@ -0,0 +1,50 @@
+import {Component, EventEmitter, Input, Output} from "@angular/core";
+import {IDType, ITreeNode} from "angular-tree-component/dist/defs/api";
+import * as _ from 'lodash';
+
+@Component({
+  selector: 'search-component',
+  templateUrl: './search.component.html',
+  styleUrls: ['./search.component.scss']
+})
+export class SearchComponent {
+  @Input() tree;
+  @Input() nodes;
+  @Input() inputTestId: string;
+
+  @Output() updateNodes: EventEmitter<any> = new EventEmitter();
+
+  searchTree(searchText: string): void {
+      if(_.isNil(searchText)){
+        return;
+      }
+      let __this = this;
+      let results: ITreeNode[] = [];
+      this.nodes.forEach( (node) => {
+        __this.searchTreeNode(node, searchText, results);
+      });
+      results.forEach(function (result) {
+        __this.expandParentByNodeId(result.id)
+      });
+      this.updateNodes.emit({
+        nodes: this.nodes,
+        filterValue: searchText
+      });
+      return;
+  }
+
+  expandParentByNodeId(id: IDType): void {
+    this.tree.treeModel.getNodeById(id).parent.expand();
+  }
+
+  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);
+      }
+    }
+  }
+}
index 5b2f22d..059937f 100644 (file)
@@ -1,13 +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 [attr.id]="pageMode"  clickOutside [classElements]="['angular-tree-component']" (clickOutsideTrigger)="clickOutside();">
+  <div class="service-planning-header" >
+    <drawing-board-header></drawing-board-header>
+  </div>
+  <div class="service-planning-content">
+    <available-models-tree class="left-side" [ngClass]="isShowComponentInfo() ?'col-md-5':'col-md-6'"
+                           (highlightInstances)="highlightInstancesBySelectingNode($event)"></available-models-tree>
+    <drawing-board-tree *ngIf="isShowTree()" class="span-over" [ngClass]="isShowComponentInfo() ?'col-md-5':'col-md-6'" (highlightNode)="highlightNodeBySelectingInstance($event)"></drawing-board-tree>
+    <component-info *ngIf="isShowComponentInfo()" class="col-md-2"></component-info>
+  </div>
+
 </div>
 
index 69546a6..641af7a 100644 (file)
@@ -2,6 +2,8 @@
 .service-planning-content {
   display: flex;
   flex: 1;
+  position: relative;
+  z-index: 0;
 }
 
 .span-over {
   height: 117px;
   margin-top: 32px;
 }
+
+component-info {
+  border-left: 1px solid #D2D2D2;
+  height: calc(100vh - 60px);
+  overflow: auto;
+
+  &.col-md-2{
+    padding: 0;
+  }
+}
index 1ce0e81..cbe8445 100644 (file)
@@ -1,8 +1,17 @@
-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 {Component, OnInit, 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';
+import {ActivatedRoute} from "@angular/router";
+import * as _ from 'lodash';
+import {DrawingBoardModes} from "./drawing-board.modes";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../shared/store/reducers";
+import {updateDrawingBoardStatus} from "../../shared/storeUtil/utils/global/global.actions";
+import {FeatureFlagsService, Features} from "../../shared/services/featureFlag/feature-flags.service";
+import {ComponentInfoService} from "./component-info/component-info.service";
+import {ComponentInfoModel, ComponentInfoType} from "./component-info/component-info-model";
 
 @Component({
   selector: 'service-planning',
@@ -10,8 +19,13 @@ import {TreeComponent} from 'angular-tree-component';
   styleUrls: ['./service-planning.component.scss']
 })
 
-export class ServicePlanningComponent {
+export class ServicePlanningComponent implements OnInit {
 
+  constructor(private route: ActivatedRoute,
+              private  store: NgRedux<AppState>) {
+  }
+
+  pageMode: DrawingBoardModes = DrawingBoardModes.CREATE;
   @ViewChild(DrawingBoardTreeComponent) drawingModelTree;
   @ViewChild(AvailableModelsTreeComponent) availableModelTree;
 
@@ -20,18 +34,23 @@ export class ServicePlanningComponent {
   }
 
   public highlightNodeBySelectingInstance(modelId: number): void {
-    this.availableModelTree.tree.treeModel.getNodeBy((node: ITreeNode) => node.data.id === modelId)
-    .setActiveAndVisible().expand();
+    // modelId might be undefined, e.g., if selected instance has no source in model
+    let matchInstance = modelId ? this.availableModelTree.tree.treeModel.getNodeBy((node: ITreeNode) => (node.data.modelUniqueId) === modelId) : undefined;
+    if (matchInstance) {
+      matchInstance.setActiveAndVisible().expand();
+    } else {
+      this.clearSelectionInTree(this.availableModelTree.tree);
+    }
   }
 
-  public highlightInstancesBySelectingNode(id: number): void {
-    if(this.isShowTree()) {
+  public highlightInstancesBySelectingNode(uniqueId: string): void {
+    if (this.isShowTree()) {
       let _this = this;
-      let matchInstances = _this.searchTree(id);
+      let matchInstances = _this.searchTree(uniqueId);
       if (!matchInstances.length)
         _this.clearSelectionInTree(_this.drawingModelTree.tree);
       matchInstances.forEach(function (instance, index) {
-        let multi : boolean = !!index;
+        let multi: boolean = !!index;
         _this.drawingModelTree.tree.treeModel.getNodeById(instance.id)
           .setActiveAndVisible(multi).expand();
       });
@@ -44,34 +63,47 @@ export class ServicePlanningComponent {
     activateNode ? activateNode.toggleActivated().blur() : null;
   }
 
-  searchTree(modelId: number) {
+  searchTree(uniqueId: string) {
     let _this = this;
     let results = [];
     let nodes = _this.drawingModelTree.nodes;
     nodes.forEach(function (node) {
-      _this.searchTreeNode(node, modelId, results);
+      _this.searchTreeNode(node, uniqueId, results);
     });
     return results;
   }
 
-  searchTreeNode(node, modelId: number, results): void {
-    if(node.modelId === modelId){
+  searchTreeNode(node, uniqueId: string, results): void {
+    if ((node.modelUniqueId) === uniqueId) {
       results.push(node);
     }
-    if (node.children != null){
-      for(let i = 0; i < node.children.length; i++){
-        this.searchTreeNode(node.children[i], modelId, results);
+
+    if (node.children != null) {
+      for (let i = 0; i < node.children.length; i++) {
+        this.searchTreeNode(node.children[i], uniqueId, results);
       }
     }
   }
 
+  ngOnInit(): void {
+    this.pageMode = (!_.isNil(this.route.routeConfig.path) && this.route.routeConfig.path !== "") ? this.route.routeConfig.path as DrawingBoardModes : DrawingBoardModes.CREATE;
+    this.store.dispatch(updateDrawingBoardStatus(this.pageMode));
+  }
+
+  isShowComponentInfo():boolean {
+    return FeatureFlagsService.getFlagState(Features.FLAG_1906_COMPONENT_INFO, this.store)
+  }
 
+  clickOutside(): void{
+    this.clearSelectionInTree(this.drawingModelTree.tree);
+    this.clearSelectionInTree(this.availableModelTree.tree);
+    ComponentInfoService.triggerComponentInfoChange.next(new ComponentInfoModel(ComponentInfoType.SERVICE, [], []))
+  }
 }
 
 export class ServicePlanningEmptyComponent extends ServicePlanningComponent {
-  isShowTree() : boolean {
+  isShowTree(): boolean {
     return false;
   }
 }
 
-
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.spec.ts
new file mode 100644 (file)
index 0000000..a6d3b53
--- /dev/null
@@ -0,0 +1,59 @@
+import {TestBed, getTestBed} from '@angular/core/testing';
+import {
+  HttpClientTestingModule,
+} from '@angular/common/http/testing';
+import {TypeNodeInformation} from "./typeNodeInformation.model";
+
+describe('Available Models Tree Service', () => {
+  let injector;
+  beforeEach(() => {
+
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: []
+    }).compileComponents();
+
+    injector = getTestBed();
+  });
+
+
+  test('TypeNodeInformation VNF', () => {
+    let type: TypeNodeInformation = new TypeNodeInformation(<any>{
+      data: {
+        type: 'VF'
+      }
+    });
+    expect(type.hierarchyName).toEqual('vnfs');
+    expect(type.existingMappingCounterName).toEqual('existingVNFCounterMap');
+  });
+
+  test('TypeNodeInformation VNF group', () => {
+    let type: TypeNodeInformation = new TypeNodeInformation(<any>{
+      data: {
+        type: 'VnfGroup'
+      }
+    });
+    expect(type.hierarchyName).toEqual('vnfGroups');
+    expect(type.existingMappingCounterName).toEqual('existingVnfGroupCounterMap');
+  });
+
+  test('TypeNodeInformation VL', () => {
+    let type: TypeNodeInformation = new TypeNodeInformation(<any>{
+      data: {
+        type: 'VL'
+      }
+    });
+    expect(type.hierarchyName).toEqual('networks');
+    expect(type.existingMappingCounterName).toEqual('existingNetworksCounterMap');
+  });
+
+  test('TypeNodeInformation Network', () => {
+    let type: TypeNodeInformation = new TypeNodeInformation(<any>{
+      data: {
+        type: 'Network'
+      }
+    });
+    expect(type.hierarchyName).toEqual('networks');
+    expect(type.existingMappingCounterName).toEqual('existingNetworksCounterMap');
+  });
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/typeNodeInformation.model.ts
new file mode 100644 (file)
index 0000000..e8e22a4
--- /dev/null
@@ -0,0 +1,39 @@
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import * as _ from 'lodash';
+
+export class TypeNodeInformation {
+  hierarchyName: string;
+  existingMappingCounterName: string;
+
+  constructor(node: ITreeNode) {
+    if (!_.isNil(node)) {
+      switch (node.data.type) {
+        case 'VF' : {
+          this.hierarchyName = 'vnfs';
+          this.existingMappingCounterName = 'existingVNFCounterMap';
+          break;
+        }
+        case 'VnfGroup' : {
+          this.hierarchyName = 'vnfGroups';
+          this.existingMappingCounterName = 'existingVnfGroupCounterMap';
+          break;
+        }
+        case 'VL' : {
+          this.hierarchyName = 'networks';
+          this.existingMappingCounterName = 'existingNetworksCounterMap';
+          break;
+        }
+        case 'Network': {
+          this.hierarchyName = 'networks';
+          this.existingMappingCounterName = 'existingNetworksCounterMap';
+          break;
+        }
+        default : {
+          console.error("Node type is not recognize");
+        }
+      }
+    }
+  }
+}
+
+
index 4ccc478..1663f7a 100644 (file)
@@ -14,6 +14,7 @@ export class ModelInfo {
   modelVersion: string;
   modelCustomizationId: string;
   modelCustomizationName: string;
+  customizationUuid: string;
 }
 
 export class RequestParameters {
@@ -109,7 +110,7 @@ export class RootObject {
 //             “relatedInstance”: {
 //                “instanceId”: “{instanceGroupId}”,
 //                “modelInfo”: {
-//                   “modelType”: “networkCollection”,
+//                   “modelType”: “networkInstanceGroup”,
 //                   “modelInvariantId”: “9ea660dc-155f-44d3-b45c-cc7648b4f31c”,
 //                   “modelVersionId”: “bb07aad1-ce2d-40c1-85cb-5392f76bb1ef”,
 //                   “modelName”: “{network collection model name}”,
index 16efd29..75f2058 100644 (file)
@@ -1,24 +1,25 @@
 import {createRequest} from './mso.factory';
 
-sessionStorage.setItem("msoRequestParametersTestApiValue","GR_API");
+
 describe('Vlantagging', () => {
-  it('should create a correct request', (done: DoneFn) => {
+  test('should create a correct request', () => {
+    sessionStorage.setItem("msoRequestParametersTestApiValue","GR_API");
     let userInputs_withEcompGeneratedNaming = {
       "productFamily": "e433710f-9217-458d-a79d-1c7aff376d89",
-      "lcpRegion": "AAIAIC25",
+      "lcpRegion": "JANET25",
       "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
       "aicZone": "YYY1",
       "platformName": "plat1",
-      "lineOfBusiness": "ecomp"
+      "lineOfBusiness": "onap"
     };
     let userInputs_withoutEcompGeneratedNaming = {
       "instanceName": "New Name",
       "productFamily": "e433710f-9217-458d-a79d-1c7aff376d89",
-      "lcpRegion": "AAIAIC25",
+      "lcpRegion": "JANET25",
       "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
       "aicZone": "YYY1",
       "platformName": "plat1",
-      "lineOfBusiness": "ecomp"
+      "lineOfBusiness": "onap"
     };
     let service = {
       "service": {
@@ -249,9 +250,9 @@ describe('Vlantagging', () => {
         "requestorId": "az2016",
         "suppressRollback": false
       },
-      "lineOfBusiness": Object({ lineOfBusinessName: "ecomp" }),
+      "lineOfBusiness": Object({ lineOfBusinessName: "onap" }),
       "cloudConfiguration": {
-        "lcpCloudRegionId": "AAIAIC25",
+        "lcpCloudRegionId": "JANET25",
         "tenantId": "092eb9e8e4b7412e8787dd091bc58e86"
       },
       "platform": Object({ platformName: "plat1" }),
@@ -285,11 +286,7 @@ describe('Vlantagging', () => {
           "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"
+              "modelType": "networkInstanceGroup"
             }
           }
         },
@@ -297,11 +294,7 @@ describe('Vlantagging', () => {
           "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"
+              "modelType": "networkInstanceGroup"
             }
           }
         }
@@ -314,6 +307,6 @@ describe('Vlantagging', () => {
     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();
+    sessionStorage.removeItem("msoRequestParametersTestApiValue");
   });
 });
index c26296e..ebca834 100644 (file)
@@ -1,4 +1,12 @@
-import { RequestInfo, RequestDetails, ModelInfo, CloudConfiguration, LineOfBusiness, Platform, RelatedInstanceList, VfcModel } from "./models/requestDetails.model";
+import {
+  CloudConfiguration,
+  LineOfBusiness,
+  ModelInfo,
+  Platform,
+  RelatedInstanceList,
+  RequestDetails,
+  RequestInfo
+} from "./models/requestDetails.model";
 import * as _ from "lodash";
 
 function extractModelInfoFromNodeTemplate(node: any, type: string) {
@@ -33,10 +41,6 @@ function extractPlatform(userInputs: any): Platform {
   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"];
@@ -50,13 +54,9 @@ function extractCloudConfiguration(userInputs: any) {
   return cloudConfig;
 }
 
-function extractModelInfoFromVfcNode(vfcModel: VfcModel): ModelInfo {
+function extractModelInfoFromVfcNode(): ModelInfo {
   let modelinfo: ModelInfo = <ModelInfo>{};
-  modelinfo.modelName = vfcModel.name;
-  modelinfo.modelType = "networkCollection";
-  modelinfo.modelVersion = vfcModel.version;
-  modelinfo.modelVersionId = vfcModel.uuid;
-  modelinfo.modelInvariantId = vfcModel.invariantUuid;
+  modelinfo.modelType = "networkInstanceGroup";
   return modelinfo;
 }
 
@@ -77,12 +77,10 @@ export function createRequest(userId: string, userInputs: any, service: any, ser
   };
   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)
+        modelInfo: extractModelInfoFromVfcNode()
       }
     };
     request.relatedInstanceList.push(networkInstanceGroup);
diff --git a/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts
new file mode 100644 (file)
index 0000000..5722aa7
--- /dev/null
@@ -0,0 +1,93 @@
+import {TestBed, ComponentFixture, tick, inject} from '@angular/core/testing';
+import {Component, DebugElement, Renderer2, Type} from "@angular/core";
+import {By} from "@angular/platform-browser";
+import {BasicFeatureFlagDirective} from "./basic.featureFlag.directive";
+import {FeatureFlagService} from "../../service/featureFlag.service";
+import {ConfigurationService} from "../../../shared/services/configuration.service";
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {NgRedux} from "@angular-redux/store";
+import {of} from "rxjs";
+
+@Component({
+  template: `
+    <div
+      id="featureFlagOff"
+      featureFlag
+      [flagName]='"featureFlagOff"'>
+    </div>
+    <div
+      id="featureFlagOn"
+      featureFlag
+      [flagName]='"featureFlagOn"'>
+    </div>`
+})
+class TestFeatureFlagComponent {
+}
+
+class MockRenderer<T> {
+  setStyle() {
+
+  }
+}
+
+class MockAppStore<T> {
+  getState() {
+    return {
+      global: {
+        flags : {
+
+        }
+      }
+    }
+  }
+}
+
+
+describe('Basic Feature Flag Directive', () => {
+  let component: TestFeatureFlagComponent;
+  let fixture: ComponentFixture<TestFeatureFlagComponent>;
+  let directiveInstance: BasicFeatureFlagDirective;
+  let elementOff: DebugElement;
+  let elementOn: DebugElement;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [
+        HttpClientTestingModule
+      ],
+      declarations: [
+        TestFeatureFlagComponent,
+        BasicFeatureFlagDirective],
+      providers: [
+        FeatureFlagService,
+        ConfigurationService,
+        {provide: NgRedux, useClass: MockAppStore},
+        {provide: Renderer2, useClass: MockRenderer}]
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(TestFeatureFlagComponent);
+    component = fixture.componentInstance;
+    elementOff = fixture.debugElement.query(By.css('#featureFlagOff'));
+    elementOn = fixture.debugElement.query(By.css('#featureFlagOn'));
+    directiveInstance = elementOff.injector.get(BasicFeatureFlagDirective);
+  });
+
+
+  test('directive should be defined', () => {
+    expect(directiveInstance).toBeDefined();
+  });
+
+  test('should hide element if feature flag is off', () => {
+    directiveInstance.flagName  = 'featureFlagOff';
+
+    directiveInstance.ngAfterContentChecked();
+    expect(elementOff.nativeElement.style.display).toEqual('none');
+  });
+
+  test('should show element if feature flag is on', () => {
+    directiveInstance.flagName  = 'featureFlagOn';
+
+    directiveInstance.ngAfterContentChecked();
+    expect(elementOn.nativeElement.style.display).toEqual('');
+  });
+});
diff --git a/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts
new file mode 100644 (file)
index 0000000..e6cbb4f
--- /dev/null
@@ -0,0 +1,29 @@
+import {AfterContentChecked, Directive, ElementRef, Input} from '@angular/core';
+import {FeatureFlagService} from "../../service/featureFlag.service";
+import * as _ from 'lodash';
+
+/************************************************************************
+    Feature Flag Directive
+    Example:
+    <div featureFlag [flagName]='"<flag name>"'></div>
+ ************************************************************************/
+@Directive({
+  selector: '[featureFlag]'
+})
+export class BasicFeatureFlagDirective implements AfterContentChecked {
+  @Input() flagName: string;
+  element: ElementRef;
+
+  constructor(el: ElementRef, private _featureToggleService: FeatureFlagService) {
+    this.element = el;
+  }
+
+  ngAfterContentChecked(): void {
+    if (!_.isNil(this.element)) {
+      const isFeatureOn: boolean = this._featureToggleService.isFeatureOn(this.flagName);
+        if(!isFeatureOn){
+          this._featureToggleService.hideElement(this.element)
+        }
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/featureFlag/featureFlag.module.ts b/vid-webpack-master/src/app/featureFlag/featureFlag.module.ts
new file mode 100644 (file)
index 0000000..d220766
--- /dev/null
@@ -0,0 +1,32 @@
+import {ModuleWithProviders, NgModule} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {BrowserModule} from "@angular/platform-browser";
+import {HttpClientModule} from "@angular/common/http";
+import {FeatureFlagService} from "./service/featureFlag.service";
+import {BasicFeatureFlagDirective} from "./directive/basic/basic.featureFlag.directive";
+
+
+@NgModule({
+  imports: [
+    BrowserModule,
+    HttpClientModule,
+    CommonModule
+  ],
+  declarations: [
+    BasicFeatureFlagDirective
+  ],
+  exports: [
+    BasicFeatureFlagDirective
+  ],
+  providers: [
+    FeatureFlagService
+  ]
+})
+export class FeatureFlagModule {
+  static forRoot(): ModuleWithProviders {
+    return {
+      ngModule: FeatureFlagModule,
+      providers: []
+    };
+  }
+}
diff --git a/vid-webpack-master/src/app/featureFlag/service/featureFlag.service.ts b/vid-webpack-master/src/app/featureFlag/service/featureFlag.service.ts
new file mode 100644 (file)
index 0000000..09ce7bb
--- /dev/null
@@ -0,0 +1,28 @@
+import {ElementRef, Injectable, Renderer2, RendererFactory2} from "@angular/core";
+import {ConfigurationService} from "../../shared/services/configuration.service";
+
+@Injectable()
+export class FeatureFlagService{
+  private features :  { [key: string]: boolean } = {};
+  private renderer: Renderer2;
+  constructor(private _configurationService: ConfigurationService,
+              rendererFactory: RendererFactory2){
+    this.renderer = rendererFactory.createRenderer(null, null);
+    this._configurationService.getFlags().subscribe((res: { [key: string]: boolean }) =>{
+      this.features = res;
+    })
+  }
+
+
+  isFeatureOn(feature : string) : boolean {
+    return this.features && this.getFeatureFlag()[feature] === true;
+  }
+
+  getFeatureFlag() : { [key: string]: boolean } {
+    return this.features;
+  }
+
+  hideElement(element: ElementRef) {
+    this.renderer.setStyle(element.nativeElement, 'display', 'none');
+  }
+}
diff --git a/vid-webpack-master/src/app/global.actions.ts b/vid-webpack-master/src/app/global.actions.ts
deleted file mode 100644 (file)
index 46575fb..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-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/healthStatus/health-status.component.spec.ts b/vid-webpack-master/src/app/healthStatus/health-status.component.spec.ts
new file mode 100644 (file)
index 0000000..8a37c77
--- /dev/null
@@ -0,0 +1,64 @@
+import {TestBed, ComponentFixture, async} from '@angular/core/testing';
+import {HealthStatusComponent} from "./health-status.component";
+import {HealthStatusService} from "../shared/server/healthStatusService/health-status.service";
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {ExternalComponentStatus} from "../shared/models/externalComponentStatus";
+import {Observable} from "rxjs";
+import {of} from "rxjs";
+
+export class MockHealthStatusService {
+
+
+  getProbe(): Observable<Array<ExternalComponentStatus>> {
+    return of(new Array<ExternalComponentStatus>(
+      new ExternalComponentStatus("x", true, {y:"r"})));
+  }
+}
+
+describe('HealthStatusComponent', () => {
+  let component: HealthStatusComponent;
+  let fixture: ComponentFixture<HealthStatusComponent>;
+  let mockHealthStatusService : MockHealthStatusService;
+
+  mockHealthStatusService =  new MockHealthStatusService();
+
+  beforeAll(done => (async () => {
+
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [{provide: HealthStatusService, useValue: mockHealthStatusService}],
+      declarations: [HealthStatusComponent]
+    });
+    await TestBed.compileComponents();
+
+    fixture = TestBed.createComponent(HealthStatusComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  })().then(done).catch(done.fail));
+
+  test('isAvailable taken from component status available field', () => {
+    expect(component.isAvailable(new ExternalComponentStatus("a", true, null))).toBeTruthy();
+    expect(component.isAvailable(new ExternalComponentStatus("a", false, null))).toBeFalsy();
+  });
+
+  test('getMetadata filter rawData ', () => {
+    let metadata:string = JSON.stringify(component.getMetadata(new ExternalComponentStatus("a", true, {a:1, rawData:2})));
+    expect(metadata).toContain("1");
+    expect(metadata.indexOf("2")).toEqual(-1);
+  });
+
+  test('componentStatus is initialized on startup ', () => {
+    expect(JSON.stringify(component.componentStatuses[0].metadata)).toContain("y");
+  });
+
+  test('when refresh componentStatus is updated', () => {
+    spyOn(mockHealthStatusService, "getProbe" ).and.returnValue(
+      of(new Array<ExternalComponentStatus>(
+      new ExternalComponentStatus("mySpecialValue", true, {y:"z"}))));
+    component.refreshData();
+    expect(component.componentStatuses[0].component).toEqual("mySpecialValue");
+    expect(mockHealthStatusService.getProbe).toHaveBeenCalledTimes(1);
+
+  });
+
+});
index 6a9ddfd..a2b1757 100644 (file)
@@ -8,9 +8,9 @@ import {HealthStatusService} from "../shared/server/healthStatusService/health-s
   styleUrls: ['./health-status.component.scss']
 })
 export class HealthStatusComponent implements OnInit {
-  private componentStatuses: Array<ExternalComponentStatus> = [];
-  private dataIsReady: boolean;
-  private lastUpdatedDate: Date;
+  componentStatuses: Array<ExternalComponentStatus> = [];
+  dataIsReady: boolean;
+  lastUpdatedDate: Date;
 
   constructor(private _healthStatusService: HealthStatusService) {
   }
diff --git a/vid-webpack-master/src/app/healthStatus/health-status.module.ts b/vid-webpack-master/src/app/healthStatus/health-status.module.ts
new file mode 100644 (file)
index 0000000..7479394
--- /dev/null
@@ -0,0 +1,25 @@
+import {NgModule} from "@angular/core";
+import {BrowserModule} from "@angular/platform-browser";
+import {FormsModule} from "@angular/forms";
+import {TooltipModule} from "ngx-tooltip";
+import {CommonModule} from "@angular/common";
+import {SharedModule} from "../shared/shared.module";
+import {FeatureFlagModule} from "../featureFlag/featureFlag.module";
+import {HealthStatusService} from "../shared/server/healthStatusService/health-status.service";
+import {HealthStatusComponent} from "./health-status.component";
+
+@NgModule({
+  imports: [
+    BrowserModule,
+    FormsModule,
+    TooltipModule,
+    CommonModule,
+    SharedModule.forRoot(),
+    FeatureFlagModule.forRoot()],
+  providers: [HealthStatusService],
+  declarations: [HealthStatusComponent],
+  entryComponents: [HealthStatusComponent],
+  exports: [HealthStatusComponent]
+})
+
+export class HealthStatusModule {}
diff --git a/vid-webpack-master/src/app/healthStatus/health-status.routing.ts b/vid-webpack-master/src/app/healthStatus/health-status.routing.ts
new file mode 100644 (file)
index 0000000..5344d2e
--- /dev/null
@@ -0,0 +1,19 @@
+import {Route} from '@angular/router';
+import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver";
+import {HealthStatusComponent} from "./health-status.component";
+
+export const HealthStatusRoutes: Route[] = [
+  {
+    path: 'healthStatus',
+    children: [
+      {
+        path: '',
+        component: HealthStatusComponent,
+        resolve: {
+          flags: FlagsResolve
+        },
+      }
+    ]
+  }
+];
+
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
deleted file mode 100644 (file)
index 41203f9..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-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
deleted file mode 100644 (file)
index 604d9e1..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<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
deleted file mode 100644 (file)
index 5db1e17..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-// 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
deleted file mode 100644 (file)
index 1adaf0e..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-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')
-    );
-  }
-
-}
index 01db0f1..6d14b14 100644 (file)
@@ -1,33 +1,30 @@
 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";
+import {SdcUiComponentsModule} from "onap-ui-angular";
 
 @NgModule({
   imports: [
     CommonModule,
     FormsModule,
     ReactiveFormsModule,
+    SdcUiComponentsModule,
     BootstrapModalModule,
     DataTableModule,
     TooltipModule,
     ModalModule,
-    InputsModule,
-    AngularSvgIconModule,
     ContextMenuModule,
     SharedModule.forRoot(),
     PopoverModule.forRoot()],
-  declarations: [InstantiationStatusComponent, AuditInfoModalComponent],
+  declarations: [InstantiationStatusComponent, ],
   providers: [InstantiationStatusComponentService, ContextMenuService]
 })
 export class InstantiationStatusModule { }
diff --git a/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.routing.ts b/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.routing.ts
new file mode 100644 (file)
index 0000000..6991eef
--- /dev/null
@@ -0,0 +1,19 @@
+import {Route} from "@angular/router";
+import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver";
+import {InstantiationStatusComponent} from "./instantiationStatus.component";
+
+export const InstantiationStatusRoutes: Route[] = [
+  {
+    path: 'instantiationStatus',
+    children: [
+      {
+        path: '',
+        component: InstantiationStatusComponent,
+        resolve: {
+          flags: FlagsResolve
+        },
+      }
+    ]
+  }
+];
+
diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts b/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts
deleted file mode 100644 (file)
index 1cff97f..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-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();
-  }
-}
-
index e0641d0..212981a 100644 (file)
@@ -3,7 +3,7 @@
     <div>
       <div class="row" style="margin-left: 0;">
         <div>
-          <span class="title">Instantiation Status</span>
+          <span class="title" [attr.data-tests-id]="'instantiation-status-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."
@@ -24,6 +24,7 @@
       <thead class="thead-dark">
       <tr>
         <th scope="col" class="smallTd">User ID</th>
+        <th scope="col" class="smallTd">Action</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>
@@ -40,8 +41,9 @@
       </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">
+        <tr *ngFor="let data of serviceInfoData; trackBy: trackByFn; let i = index" [ngClass]="{'odd' : data.serviceIndex%2 == 1}" [id]="data.jobId">
           <td class="smallTd" id="userId"><custom-ellipsis [id]="data.userId" [value]="data.userId"></custom-ellipsis></td>
+          <td class="smallTd" id="action"><custom-ellipsis [id]="data.action" [value]="data.action | capitalizeAndFormat"></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="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 [value]="data.serviceStatus.tooltip"  [popoverType]="data?.serviceStatus?.color" style="float: left;">
+              <svg-icon
+                id="jobStatusIcon-{{i}}"
+                (click)="auditInfo(data)"
+                [mode]="data.serviceStatus.color"
+                [size]="'large'"
+                [name]="data.serviceStatus.iconClassName">
+              </svg-icon>
+
             </custom-popover>
-            <div class="menu-div" (click)="onContextMenu($event, data); currentJobId = data.jobId">
+            <div class="menu-div" (click)="onContextMenu($event, data)">
                 <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>
+                  <ng-template *ngFor="let action of contextMenuActions" contextMenuItem let-item
+                               [visible]="action.visible"
+                               [enabled]="action.enabled"
+                               (execute)="action.click($event.item)">
+                    <div [attr.data-tests-id]="action.dataTestId"
+                         [tooltip]="action?.tooltip"
+                         [tooltipDisabled]="!action.tooltip">
+                      <span class="context-menu-icon">
+                        <i class="fa {{action.className}}" aria-hidden="true"></i>
+                      </span>
+                      {{action.name}}
+                    </div>
+                  </ng-template>
               </context-menu>
             </div>
           </td>
@@ -93,7 +90,6 @@
       </tbody>
     </table>
   </div>
-  <audit-info-modal></audit-info-modal>
 </div>
 
 
index c9f434e..4848d8e 100644 (file)
@@ -1,5 +1,6 @@
 import {getTestBed, TestBed} from '@angular/core/testing';
 import {
+  COMPLETED_WITH_ERRORS,
   INPROGRESS,
   InstantiationStatusComponentService,
   PAUSE,
@@ -10,24 +11,64 @@ import {
   X_O
 } from './instantiationStatus.component.service';
 import {ServiceInfoModel} from '../shared/server/serviceInfo/serviceInfo.model';
-import { Observable } from 'rxjs/Rx';
+import {AaiService} from "../shared/services/aaiService/aai.service";
+import {MsoService} from "../shared/services/msoService/mso.service";
+import {NgRedux} from "@angular-redux/store";
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {FeatureFlagsService} from "../shared/services/featureFlag/feature-flags.service";
+import {DrawingBoardModes} from "../drawingBoard/service-planning/drawing-board.modes";
+import {RouterTestingModule} from "@angular/router/testing";
+import {of} from "rxjs";
+import {UrlTree} from "@angular/router";
 
+class MockAppStore<T> {
+
+  getState() {
+    return {
+      global: {
+        flags: {
+          'FLAG_1902_NEW_VIEW_EDIT': true,
+
+        }
+      }
+    }
+  }
+
+  dispatch() {
+
+  }
+}
 describe('Instantiation Status Service', () => {
   let injector;
+  let aaiService: AaiService;
+  let msoService: MsoService;
   let service: InstantiationStatusComponentService;
 
-  beforeEach(() => {
+
+  beforeAll(done => (async () => {
     TestBed.configureTestingModule({
-      imports: [],
-      providers: [InstantiationStatusComponentService]
+      imports: [
+        HttpClientTestingModule,
+        RouterTestingModule,
+      ],
+      providers: [
+        InstantiationStatusComponentService,
+        AaiService,
+        MsoService,
+        FeatureFlagsService,
+        {provide: NgRedux, useClass: MockAppStore}]
     });
+    await TestBed.compileComponents();
 
     injector = getTestBed();
+    aaiService = injector.get(AaiService);
+    msoService = injector.get(MsoService);
     service = injector.get(InstantiationStatusComponentService);
-  });
 
-  it('generateServiceInfoDataMapping should return mapping of arrays', (done: DoneFn) => {
-    let data : Array<ServiceInfoModel> = generateServiceInfoData();
+  })().then(done).catch(done.fail));
+
+  test('generateServiceInfoDataMapping should return mapping of arrays', () => {
+    let data : ServiceInfoModel[] = generateServiceInfoData();
     let result = service.generateServiceInfoDataMapping(data);
 
     expect(result['1']).toBeDefined();
@@ -37,53 +78,81 @@ describe('Instantiation Status Service', () => {
     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) => {
+  test('generateServiceInfoDataMapping if array is empty  should return empty object', () => {
     let result = service.generateServiceInfoDataMapping([]);
 
     expect(result['1']).not.toBeDefined();
     expect(result['2']).not.toBeDefined();
     expect(result['3']).not.toBeDefined();
-    done();
   });
 
-  it('convertObjectToArray', (done: DoneFn) => {
+  test('convertObjectToArray', () => {
 
-    spyOn(service, 'convertObjectToArray').and.returnValue(
-      Observable.of([])
+    jest.spyOn(service, 'convertObjectToArray').mockReturnValue(
+      of([])
     );
 
-    let data : Array<ServiceInfoModel> = generateServiceInfoData();
+    let data : ServiceInfoModel[] = generateServiceInfoData();
     service.convertObjectToArray(data).subscribe((result) => {
       expect(result).toBeDefined();
-      done();
     });
   });
 
-  it('getStatusTooltip should return status popover', (done: DoneFn) => {
+  test('click on "Open" button should open new view edit' , ()=>{
+    const item = {
+      serviceModelId : 'serviceModelId',
+      serviceInstanceId : 'serviceInstanceId',
+      serviceType : 'serviceType',
+      subscriberId : 'subscriberId'
+    };
+    let params:UrlTree = service.getNewViewEditUrlTree(item, DrawingBoardModes.VIEW);
+    expect(params.toString().startsWith('/servicePlanning/VIEW')).toBeTruthy();
+    expect(params.queryParams).toEqual(
+      {
+        serviceModelId: item.serviceModelId,
+        serviceInstanceId: item.serviceInstanceId,
+        serviceType : item.serviceType,
+        subscriberId : item.subscriberId
+      });
+  });
+
+  test('build the View Edit url' , ()=>{
+    const item = {
+      serviceModelId : '28aeb8f6-5620-4148-8bfb-a5fb406f0309',
+    };
+    let serviceModelUrl: string = '/servicePlanning/EDIT?serviceModelId=28aeb8f6-5620-4148-8bfb-a5fb406f0309';
+    let suffix:string = '../../serviceModels.htm#';
+    let tree:UrlTree = service.getNewViewEditUrlTree(item, DrawingBoardModes.EDIT);
+    let result = service.getViewEditUrl(tree);
+    expect (suffix + serviceModelUrl).toEqual(result);
+  });
+
+  test('getStatusTooltip should return status popover', () => {
     let result : ServiceStatus  = service.getStatus('pending');
-    expect(result.tooltip).toEqual('Pending: The service will automatically be sent for instantiation as soon as possible.');
+    expect(result.tooltip).toEqual('Pending: The action required will be sent as soon as possible.');
 
     result = service.getStatus('IN_PROGRESS');
-    expect(result.tooltip).toEqual('In-progress: the service is in process of instantiation.');
+    expect(result.tooltip).toEqual('In-progress: the service is in process of the action required.');
 
     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.');
+    expect(result.tooltip).toEqual('Failed: All planned actions have failed.');
 
     result = service.getStatus('COMPLETED');
-    expect(result.tooltip).toEqual('Completed successfully: Service is successfully instantiated.');
+    expect(result.tooltip).toEqual('Completed successfully: Service is successfully instantiated, updated or deleted.');
 
     result = service.getStatus('STOPPED');
     expect(result.tooltip).toEqual('Stopped: Due to previous failure, will not be instantiated.');
-    done();
+
+    result = service.getStatus('COMPLETED_WITH_ERRORS');
+    expect(result.tooltip).toEqual('Completed with errors: some of the planned actions where successfully committed while other have not.\n Open the service to check it out.');
   });
 
-  it('getStatusTooltip should return correct icon per job status', (done: DoneFn) => {
+  test('getStatusTooltip should return correct icon per job status', () => {
     let result : ServiceStatus  = service.getStatus('pending');
     expect(result.iconClassName).toEqual(PENDING);
 
@@ -101,9 +170,10 @@ describe('Instantiation Status Service', () => {
 
     result = service.getStatus('STOPPED');
     expect(result.iconClassName).toEqual(STOPED);
-    done();
-  });
 
+    result = service.getStatus('COMPLETED_WITH_ERRORS');
+    expect(result.iconClassName).toEqual(COMPLETED_WITH_ERRORS);
+  });
 
   function generateServiceInfoData(){
     return JSON.parse(JSON.stringify([
index 293397c..0e4451c 100644 (file)
@@ -1,23 +1,38 @@
 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';
-
+import * as _ from 'lodash';
+import {Observable} from 'rxjs/Observable';
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../shared/store/reducers";
+import {AaiService} from "../shared/services/aaiService/aai.service";
+import {ServiceModel} from "../shared/models/serviceModel";
+import {FeatureFlagsService, Features} from "../shared/services/featureFlag/feature-flags.service";
+import {DrawingBoardModes} from "../drawingBoard/service-planning/drawing-board.modes";
+import {updateDrawingBoardStatus} from "../shared/storeUtil/utils/global/global.actions";
+import {Router, UrlTree} from "@angular/router";
+import {of} from "rxjs";
+import {MsoService} from "../shared/services/msoService/mso.service";
 export let PENDING : string = "pending";
-export let INPROGRESS : string = "inprogress";
+export let INPROGRESS : string = "in_progress";
 export let PAUSE : string = "pause";
-export let X_O : string = "X_o";
-export let SUCCESS_CIRCLE : string = "success+Circle";
-export let STOPED : string = "stoped";
+export let X_O : string = "x-circle-o";
+export let SUCCESS_CIRCLE : string = "success-circle-o";
+export let STOPED : string = "stop";
+export let COMPLETED_WITH_ERRORS : string = "success_with_warning";
 
 
 @Injectable()
 export class InstantiationStatusComponentService {
-  generateServiceInfoDataMapping(arr: Array<ServiceInfoModel>) : { [serviceInstanceId: string]: Array<ServiceInfoModel>}{
-    let serviceInfoData: { [serviceInstanceId: string]: Array<ServiceInfoModel>; } = {};
+  constructor( private _aaiService: AaiService,
+               private _msoService: MsoService,
+               private _router : Router,
+               private _store: NgRedux<AppState>) {
+  }
+
+  generateServiceInfoDataMapping(arr: ServiceInfoModel[]) : { [serviceInstanceId: string]: ServiceInfoModel[]}{
+    let serviceInfoData: { [serviceInstanceId: string]: ServiceInfoModel[]; } = {};
     for(let item of arr){
-      if(isNullOrUndefined(serviceInfoData[item.templateId])){
+      if(_.isNil(serviceInfoData[item.templateId])){
         serviceInfoData[item.templateId] = [item];
       }else {
         serviceInfoData[item.templateId].push(item);
@@ -26,7 +41,7 @@ export class InstantiationStatusComponentService {
     return serviceInfoData;
   }
 
-  convertObjectToArray(arr: Array<ServiceInfoModel>) : Observable<Array<ServiceInfoUiModel>>{
+  convertObjectToArray(arr: ServiceInfoModel[]) : Observable<ServiceInfoUiModel[]>{
     const obj = this.generateServiceInfoDataMapping(arr);
     let index:number = 0;
     let result = [];
@@ -40,25 +55,108 @@ export class InstantiationStatusComponentService {
     }
 
     console.log(result);
-    return Observable.of(result);
+    return of(result);
+  }
+
+  isDrawingBoardViewEdit(serviceModel: ServiceModel): boolean {
+    if (!_.isNil(serviceModel.vidNotions) && !_.isNil(serviceModel.vidNotions.viewEditUI)
+      && serviceModel.vidNotions.viewEditUI !== 'legacy'){
+      return true;
+    }
+    return false;
+  }
+
+  open(item: ServiceInfoModel): void {
+    if (FeatureFlagsService.getFlagState(Features.FLAG_1902_VNF_GROUPING, this._store)) {
+      this._aaiService.getServiceModelById(item['serviceModelId']).subscribe((result)=>{
+        const serviceModel =  new ServiceModel(result);
+
+        if (this.isDrawingBoardViewEdit(serviceModel)) {
+          this.navigateToNewViewEdit(item, DrawingBoardModes.EDIT);
+          return;
+        }
+
+        this.navigateToNewViewOnlyOrOldEditView(item);
+
+      });
+    }
+
+    /*this else is here only to save time in case we don't need to retrieve service model
+    it can be removed once it service model is always needed, and it doesn't save time*/
+    else {
+      this.navigateToNewViewOnlyOrOldEditView(item);
+    }
+  }
+
+  navigateToNewViewOnlyOrOldEditView(item: ServiceInfoModel) {
+    if (FeatureFlagsService.getFlagState(Features.FLAG_1902_NEW_VIEW_EDIT, this._store)) {
+      this.navigateToNewViewEdit(item, DrawingBoardModes.VIEW);
+    }
+    else {
+      this.navigateToOldViewEdit(item);
+    }
+  }
+
+  navigateToOldViewEdit(item: ServiceInfoModel) {
+    let query =
+      `subscriberId=${item.subscriberId}&` +
+      `subscriberName=${item.subscriberName}&` +
+      `serviceType=${item.serviceType}&` +
+      `serviceInstanceId=${item.serviceInstanceId}`;
+
+    this._store.dispatch(updateDrawingBoardStatus(DrawingBoardModes.OLD_VIEW_EDIT));
+    window.parent.location.assign('../../serviceModels.htm#/instantiate?' + query);
+  }
+
+  navigateToNewViewEdit(item: ServiceInfoModel, mode: DrawingBoardModes): void{
+    this._store.dispatch(updateDrawingBoardStatus(mode));
+    const viewEditUrlTree:UrlTree = this.getNewViewEditUrlTree(item, mode);
+    this._router.navigateByUrl(viewEditUrlTree);
+    window.parent.location.assign(this.getViewEditUrl(viewEditUrlTree));
+  }
+
+  getNewViewEditUrlTree(item: ServiceInfoModel, mode: DrawingBoardModes): UrlTree {
+    return this._router.createUrlTree(
+      ['/servicePlanning/' + mode],
+      {
+        queryParams:
+          {
+            serviceModelId: item.serviceModelId,
+            serviceInstanceId: item.serviceInstanceId,
+            serviceType : item.serviceType,
+            subscriberId : item.subscriberId,
+            jobId: item.jobId
+          }
+      });
+  }
+
+  getViewEditUrl(viewEditUrlTree:UrlTree): string {
+    return '../../serviceModels.htm#' + viewEditUrlTree.toString();
+
   }
 
   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.');
+        return new ServiceStatus(PENDING, 'primary', 'Pending: The action required will be sent as soon as possible.');
       case  'IN_PROGRESS' :
-        return new ServiceStatus(INPROGRESS, '#009FDB', 'In-progress: the service is in process of instantiation.');
+        return new ServiceStatus(INPROGRESS, 'primary', 'In-progress: the service is in process of the action required.');
       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.');
+        return new ServiceStatus(PAUSE, 'primary', '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.');
+        return new ServiceStatus(X_O, 'error', 'Failed: All planned actions have failed.');
       case  'COMPLETED' :
-        return new ServiceStatus(SUCCESS_CIRCLE, '#53AD15', 'Completed successfully: Service is successfully instantiated.');
+        return new ServiceStatus(SUCCESS_CIRCLE, 'success', 'Completed successfully: Service is successfully instantiated, updated or deleted.');
       case  'STOPPED' :
-        return new ServiceStatus(STOPED, '#D02B2B', 'Stopped: Due to previous failure, will not be instantiated.');
+        return new ServiceStatus(STOPED, 'error', 'Stopped: Due to previous failure, will not be instantiated.');
+      case  'COMPLETED_WITH_ERRORS' :
+        return new ServiceStatus(COMPLETED_WITH_ERRORS, 'success', 'Completed with errors: some of the planned actions where successfully committed while other have not.\n Open the service to check it out.');
     }
   }
+
+  retry(item: ServiceInfoModel): void {
+      this.navigateToNewViewEdit(item, DrawingBoardModes.RETRY_EDIT);
+  }
 }
 
 
index 00b6a99..53dfcc1 100644 (file)
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import {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 {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';
+import {HttpClientTestingModule} from '@angular/common/http/testing';
+import {ScrollToModule} from '@nicky-lenaers/ngx-scroll-to';
+import {ConfigurationService} from '../shared/services/configuration.service';
+import {LogService} from '../shared/utils/log/log.service';
+import {NgRedux} from '@angular-redux/store';
+import {RouterTestingModule} from '@angular/router/testing';
+import {CapitalizeAndFormatPipe} from "../shared/pipes/capitalize/capitalize-and-format.pipe";
+import {AaiService} from "../shared/services/aaiService/aai.service";
+import {MsoService} from "../shared/services/msoService/mso.service";
+import {FeatureFlagsService} from "../shared/services/featureFlag/feature-flags.service";
+import {JobStatus, ServiceAction} from "../shared/models/serviceInstanceActions";
+import each from 'jest-each';
+import {ServiceInfoModel} from "../shared/server/serviceInfo/serviceInfo.model";
+import { TooltipModule } from 'ngx-tooltip';
+
+class MockAppStore<T> {
+
+  getState() {
+    return {
+      global: {
+        flags: {
+          'FLAG_1902_NEW_VIEW_EDIT': true
+        }
+      }
+    }
+  }
+
+  dispatch() {
+
+  }
+}
 
 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"}];
-
+let item = new ServiceInfoModel();
+  beforeAll(done => (async () => {
 
-  beforeEach(async(() => {
     TestBed.configureTestingModule({
-      imports: [HttpClientTestingModule, ContextMenuModule, ScrollToModule.forRoot()],
-      providers: [ServiceInfoService, InstantiationStatusComponentService, ContextMenuService, ConfigurationService, LogService],
-      declarations: [InstantiationStatusComponent],
+      imports: [
+        HttpClientTestingModule,
+        ContextMenuModule,
+        ScrollToModule.forRoot(),
+        RouterTestingModule,
+        TooltipModule
+      ],
+      providers: [
+        ServiceInfoService,
+        InstantiationStatusComponentService,
+        AaiService,
+        MsoService,
+        ContextMenuService,
+        FeatureFlagsService,
+        ConfigurationService,
+        LogService,
+        {provide: NgRedux, useClass: MockAppStore}
+      ],
+      declarations: [InstantiationStatusComponent, CapitalizeAndFormatPipe],
       schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
-    }).compileComponents();
-  }));
+    });
+    await TestBed.compileComponents();
 
-  beforeEach(() => {
     fixture = TestBed.createComponent(InstantiationStatusComponent);
     component = fixture.componentInstance;
     fixture.detectChanges();
-  });
+  })().then(done).catch(done.fail));
+
 
-  it('component should initialize basic parameters', (done: DoneFn) => {
+  test('component should initialize basic parameters', () => {
     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) => {
+  test('component constructor should call activateInterval and ngOnInit', () => {
     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();
-    });
+  const enableDeleteItemsDataProvider = [
+    ['INSTANTIATE action PENDING job status',JobStatus.PENDING , ServiceAction.INSTANTIATE],
+    ['DELETE action PENDING job status',JobStatus.PENDING , ServiceAction.DELETE],
+    ['UPDATE action PENDING job status',JobStatus.PENDING , ServiceAction.UPDATE],
+    ['INSTANTIATE action STOPPED job status',JobStatus.STOPPED , ServiceAction.INSTANTIATE]];
+  each(enableDeleteItemsDataProvider).test('delete item should enable for %s', (desc, jobStatus, action ) => {
+    item.action=action;
+    item.jobStatus=jobStatus;
+    let isDeleteEnabled: boolean = component.isDeleteEnabled(item);
+    expect(isDeleteEnabled).toBeTruthy();
+  });
 
-    disableDeleteItems.forEach((item) => {
-      let isDeleteEnabled: boolean = component.isDeleteEnabled(item);
-      expect(isDeleteEnabled).toBeFalsy();
-    });
-    done();
+  const disableDeleteItemsDataProvider = [
+    [ 'INSTANTIATE action COMPLETED job status', JobStatus.COMPLETED , ServiceAction.INSTANTIATE],
+    [ 'INSTANTIATE action FAILED job status', JobStatus.FAILED , ServiceAction.INSTANTIATE],
+    [ 'INSTANTIATE action IN_PROGRESS job status', JobStatus.IN_PROGRESS, ServiceAction.INSTANTIATE],
+    [ 'INSTANTIATE action COMPLETED_WITH_ERRORS job status', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.INSTANTIATE],
+    [ 'DELETE action IN_PROGRESS job status', JobStatus.IN_PROGRESS, ServiceAction.DELETE],
+    [ 'DELETE action COMPLETED_WITH_ERRORS job status',JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE],
+    [ 'UPDATE action IN_PROGRESS job status', JobStatus.IN_PROGRESS, ServiceAction.UPDATE],
+    [ 'UPDATE action COMPLETED_WITH_ERRORS job status', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE],
+    [ 'INSTANTIATE action UNKNOWN job status', "UNKNOWN", ServiceAction.INSTANTIATE]];
+  each(disableDeleteItemsDataProvider).test('delete item should disable for %s', (desc,jobStatus, action ) => {
+    item.action=action;
+    item.jobStatus=jobStatus;
+    let isDeleteEnabled: boolean = component.isDeleteEnabled(item);
+    expect(isDeleteEnabled).toBeFalsy();
   });
 
-  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 enableHideItemsDataProvider = [
+    ['instantiate action job status COMPLETED',JobStatus.COMPLETED, ServiceAction.INSTANTIATE ],
+    ['instantiate action job status FAILED',JobStatus.FAILED, ServiceAction.INSTANTIATE  ],
+    ['instantiate action job status STOPPED', JobStatus.STOPPED, ServiceAction.INSTANTIATE  ],
+    ['instantiate action job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.INSTANTIATE  ],
+    ['delete action job status COMPLETED', JobStatus.COMPLETED, ServiceAction.DELETE ],
+    ['delete action job status FAILED', JobStatus.FAILED, ServiceAction.DELETE  ],
+    ['delete action job status STOPPED',JobStatus.STOPPED, ServiceAction.DELETE  ],
+    ['delete action job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE  ],
+    ['update action job status COMPLETED', JobStatus.COMPLETED, ServiceAction.UPDATE ],
+    ['update action job status FAILED',JobStatus.FAILED, ServiceAction.UPDATE  ],
+    ['update action job status STOPPED', JobStatus.STOPPED, ServiceAction.UPDATE  ],
+    ['update action job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE ]];
+  each(enableHideItemsDataProvider).test('hide item should be enabled for %s', (desc, jobStatus, action ) => {
+    item.action=action;
+    item.jobStatus=jobStatus;
+    let isHideEnabled: boolean = component.isHideEnabled(item);
+    expect(isHideEnabled).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();
+  const disableHideItemsDataProvider = [
+    ['action instantiate job status IN_PROGRESS',JobStatus.IN_PROGRESS , ServiceAction.INSTANTIATE],
+    ['action instantiate job status PAUSE',JobStatus.PAUSE, ServiceAction.INSTANTIATE],
+    ['action instantiate job status PENDING', JobStatus.PENDING, ServiceAction.INSTANTIATE ],
+    ['action instantiate job status UNKNOWN', "UNKNOWN", ServiceAction.INSTANTIATE],
+    ['update instantiate job status IN_PROGRESS', JobStatus.IN_PROGRESS , ServiceAction.UPDATE],
+    ['update instantiate job status PAUSE', JobStatus.PAUSE, ServiceAction.UPDATE],
+    ['update instantiate job status PENDING', JobStatus.PENDING, ServiceAction.UPDATE ],
+    ['update instantiate job status UNKNOWN',"UNKNOWN", ServiceAction.UPDATE],
+    ['delete instantiate job status IN_PROGRESS',JobStatus.IN_PROGRESS , ServiceAction.DELETE],
+    ['delete instantiate job status PAUSE', JobStatus.PAUSE, ServiceAction.DELETE],
+    ['delete instantiate job status PENDING', JobStatus.PENDING, ServiceAction.DELETE ],
+    ['delete instantiate job status UNKNOWN', "UNKNOWN", ServiceAction.DELETE]];
+  each(disableHideItemsDataProvider).test('hide item should disable for %s', (desc, jobStatus, action ) => {
+    item.action=action;
+    item.jobStatus=jobStatus;
+    let isHideEnabled: boolean = component.isHideEnabled(item);
+    expect(isHideEnabled).toBeFalsy();
+  });
+
+  const enableAuditItemsDataProvider = [
+    ['instantiate action UNKNOWN job status', "UNKNOWN", ServiceAction.INSTANTIATE ],
+    ['delete action JobStatus IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.DELETE ],
+    ['delete action JobStatus PAUSE', JobStatus.PAUSE, ServiceAction.DELETE ],
+    ['delete action JobStatus FAILED', JobStatus.FAILED, ServiceAction.DELETE ],
+    ['delete action JobStatus COMPLETED', JobStatus.COMPLETED, ServiceAction.DELETE ],
+    ['delete action JobStatus COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE ],
+    ['update action JobStatus IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.UPDATE ],
+    ['update action JobStatus PAUSE', JobStatus.PAUSE, ServiceAction.UPDATE  ],
+    ['update action JobStatus COMPLETED', JobStatus.COMPLETED, ServiceAction.UPDATE  ],
+    ['update action JobStatus FAILED', JobStatus.FAILED, ServiceAction.UPDATE  ],
+    ['update action JobStatus COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE ]];
+
+  each(enableAuditItemsDataProvider).test('audit item should be enabled for %s', (desc, jobStatus, action ) => {
+    item.action=action;
+    item.jobStatus=jobStatus;
+    const isAuditEnabled: boolean = component.isAuditInfoEnabled(item);
+    expect(isAuditEnabled).toBeTruthy();
+  });
+
+  const disableAuditItemsDataProvider = [
+    ['Job status STOPPED action update', JobStatus.STOPPED, ServiceAction.UPDATE ],
+    ['Job status PENDING action update', JobStatus.PENDING, ServiceAction.UPDATE ],
+    ['Job status UNKNOWN action update', "UNKNOWN", ServiceAction.UPDATE],
+    ['Job status STOPPED action delete',JobStatus.STOPPED, ServiceAction.DELETE],
+    ['Job status PENDING action delete', JobStatus.PENDING, ServiceAction.DELETE ],
+    ['Job status UNKNOWN action delete', "UNKNOWN", ServiceAction.DELETE]];
+  each(disableAuditItemsDataProvider).test('audit item should be disabled for %s', (desc, jobStatus, action ) => {
+    item.action=action;
+    item.jobStatus=jobStatus;
+    let isAuditEnabled: boolean = component.isAuditInfoEnabled(item);
+    expect(isAuditEnabled).toBeFalsy();
+  });
+
+  const enableOpenItemsDataProvider = [
+    ['action instantiate job status PAUSE', JobStatus.PAUSE, ServiceAction.INSTANTIATE ],
+    ['action instantiate job status COMPLETED', JobStatus.COMPLETED, ServiceAction.INSTANTIATE  ],
+    ['action instantiate job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.INSTANTIATE ],
+    ['action delete job status PENDING', JobStatus.PENDING, ServiceAction.DELETE ],
+    ['action delete job status FAILED', JobStatus.FAILED, ServiceAction.DELETE ],
+    ['action delete job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.DELETE ],
+    ['action update job status PENDING', JobStatus.PENDING, ServiceAction.UPDATE ],
+    ['action update job status PAUSE', JobStatus.PAUSE, ServiceAction.UPDATE ],
+    ['action update job status COMPLETED', JobStatus.COMPLETED, ServiceAction.UPDATE  ],
+    ['action update job status FAILED', JobStatus.FAILED, ServiceAction.UPDATE  ],
+    ['action update job status COMPLETED_WITH_ERRORS', JobStatus.COMPLETED_WITH_ERRORS, ServiceAction.UPDATE ]];
+  each(enableOpenItemsDataProvider).test('open item should be enabled for %s', (desc, jobStatus, action ) => {
+    item.action=action;
+    item.jobStatus=jobStatus;
+    let isOpenEnabled: boolean = component.isOpenEnabled(item);
+    expect(isOpenEnabled).toBeTruthy();
   });
+
+  const disableOpenItemsDataProvider = [
+    ['action instantiate job status STOPPED', JobStatus.STOPPED, ServiceAction.INSTANTIATE],
+    ['action instantiate job status FAILED', JobStatus.FAILED, ServiceAction.INSTANTIATE],
+    ['action instantiate job status UNKNOWN', "UNKNOWN", ServiceAction.INSTANTIATE],
+    ['action update job status STOPPED', JobStatus.STOPPED, ServiceAction.UPDATE ],
+    ['action update job status IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.UPDATE ],
+    ['action update job status UNKNOWN', "UNKNOWN", ServiceAction.UPDATE],
+    ['action delete job status COMPLETED', JobStatus.COMPLETED, ServiceAction.DELETE],
+    ['action delete job status PAUSE', JobStatus.PAUSE, ServiceAction.DELETE],
+    ['action delete job status IN_PROGRESS', JobStatus.IN_PROGRESS, ServiceAction.DELETE ],
+    ['action delete job status UNKNOWN',"UNKNOWN", ServiceAction.DELETE]];
+  each(disableOpenItemsDataProvider).test('open item should be disabled for %s', (desc, jobStatus, action ) => {
+    item.action=action;
+    item.jobStatus=jobStatus;
+    let isOpenEnabled: boolean = component.isOpenEnabled(item);
+    expect(isOpenEnabled).toBeFalsy();
+  });
+
 });
index ed45ce4..f3f6519 100644 (file)
@@ -1,40 +1,97 @@
-import {AfterViewChecked, Component, ViewChild} from '@angular/core';
+import {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 {AuditInfoModalComponent} from "../shared/components/auditInfoModal/auditInfoModal.component";
 import * as _ from 'lodash';
 import {ScrollToConfigOptions, ScrollToService} from '@nicky-lenaers/ngx-scroll-to';
-import {ConfigurationService} from "../services/configuration.service";
+import {ConfigurationService} from "../shared/services/configuration.service";
 import {LogService} from '../shared/utils/log/log.service';
-
+import {AppState} from "../shared/store/reducers";
+import {NgRedux} from '@angular-redux/store';
+import {JobStatus, ServiceAction} from "../shared/models/serviceInstanceActions";
+import {DrawingBoardModes} from "../drawingBoard/service-planning/drawing-board.modes";
+
+export interface MenuAction{
+  name: string;
+  dataTestId: string;
+  className: string;
+  tooltip?: string;
+  click(item: ServiceInfoModel): void;
+  enabled (item?: ServiceInfoModel): boolean;
+  visible (item?: ServiceInfoModel): boolean;
+}
 
 @Component({
   selector : 'instantiation-status',
   templateUrl : './instantiationStatus.component.html',
   styleUrls : ['./instantiationStatus.component.scss']
 })
-export class InstantiationStatusComponent implements AfterViewChecked{
-
+export class InstantiationStatusComponent {
 
   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;
+  serviceInfoData: ServiceInfoModel[] = null;
   @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent;
 
+  public contextMenuActions: Array<MenuAction> = [
+    {
+      name: "Redeploy",
+      dataTestId: "context-menu-retry",
+      className: "fa-repeat",
+      click: (item: ServiceInfoModel) => this.retryItem(item),
+      enabled: () =>  true,
+      visible: (item: ServiceInfoModel) =>  item.isRetryEnabled,
+    },
+    {
+      name: "Open",
+      dataTestId: "context-menu-open",
+      className: "fa-external-link",
+      click: (item: ServiceInfoModel) => this.instantiationStatusComponentService.open(item),
+      enabled: (item: ServiceInfoModel) =>  this.isOpenEnabled(item),
+      visible: () =>  true,
+    },
+    {
+      name: "Audit info",
+      dataTestId: "context-menu-audit-info",
+      className: "fa-info-circle",
+      click: (item: ServiceInfoModel) => this.auditInfo(item),
+      enabled: (item: ServiceInfoModel) =>  this.isAuditInfoEnabled(item),
+      visible: () =>  true,
+    },
+    {
+      name: "Delete",
+      dataTestId: "context-menu-remove",
+      className: "fa-trash-o",
+      click: (item: ServiceInfoModel) => this.deleteItem(item),
+      enabled: (item: ServiceInfoModel) =>  this.isDeleteEnabled(item),
+      visible: () =>  true,
+    },
+    {
+      name: "Hide request",
+      dataTestId: "context-menu-hide",
+      className: "fa-eye-slash",
+      tooltip: "Hide this service from this table",
+      click: (item: ServiceInfoModel) => this.hideItem(item),
+      enabled: (item: ServiceInfoModel) =>  this.isHideEnabled(item),
+      visible: () =>  true,
+    }
+  ];
+
+  flags: any;
   constructor(private _serviceInfoService: ServiceInfoService,
               private _instantiationStatusComponentService : InstantiationStatusComponentService,
               private _contextMenuService: ContextMenuService,
               private _configurationService : ConfigurationService,
               private _scrollToService: ScrollToService,
-              private _logService : LogService) {
+              private _logService : LogService,
+              private _store: NgRedux<AppState>) {
     this.instantiationStatusComponentService = _instantiationStatusComponentService;
     this.configurationService = this._configurationService;
     this.configurationService.getConfiguration("refreshTimeInstantiationDashboard").subscribe(response => {
@@ -58,61 +115,73 @@ export class InstantiationStatusComponent implements AfterViewChecked{
 
   refreshData(): void {
     this.dataIsReady = false;
-    this._serviceInfoService.getServicesJobInfo(true)
-      .subscribe((res: Array<ServiceInfoModel>) => {
+    this._serviceInfoService.getServicesJobInfo(true, this.lastUpdatedDate === null)
+      .subscribe((res: 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;
+            this.scrollToElement(this.findFirstVisibleJob());
           }
         });
       })
   }
 
-  ngAfterViewChecked(){
-    if (this.scroll) {
-      this.scrollToElement();
-      this.scroll = false;
-    }
+  trackByFn(index: number, item: ServiceInfoModel){
+    return _.isNil(item) ? null : item.jobId;
   }
 
-
-
-  isDeleteEnabled(item):boolean {
-    return _.includes(['PENDING', 'STOPPED'], item.jobStatus);
-  }
-
-  deleteItem(item): void {
+  deleteItem(item: ServiceInfoModel): void {
     this._serviceInfoService.deleteJob(item.jobId).subscribe(() => {
       this.refreshData();
     });
   }
 
-  hideItem(item): void {
+  hideItem(item: ServiceInfoModel): void {
     this._serviceInfoService.hideJob(item.jobId).subscribe(() => {
       this.refreshData();
     });
   }
+  
+  retryItem(item: ServiceInfoModel) : void {
+    if (item.isRetryEnabled) {
+      this._instantiationStatusComponentService.retry(item);
+    }
+  }
 
   auditInfo(jobData : ServiceInfoModel): void {
     AuditInfoModalComponent.openModal.next(jobData);
+  }
 
+  isOpenEnabled(item: ServiceInfoModel):boolean {
+    switch(item.action) {
+      case ServiceAction.DELETE:
+      return _.includes([ JobStatus.PENDING, JobStatus.COMPLETED_WITH_ERRORS, JobStatus.FAILED], item.jobStatus);
+      case ServiceAction.UPDATE:
+        return _.includes([JobStatus.PENDING, JobStatus.PAUSE, JobStatus.COMPLETED_WITH_ERRORS, JobStatus.COMPLETED, JobStatus.FAILED], item.jobStatus);
+      default:
+        return _.includes([JobStatus.COMPLETED, JobStatus.PAUSE, JobStatus.COMPLETED_WITH_ERRORS], item.jobStatus);
+    }
   }
 
-  isOpenVisible(item):boolean {
-    return _.includes(['COMPLETED', 'PAUSE'], item.jobStatus);
+  isAuditInfoEnabled(item: ServiceInfoModel): boolean {
+    if(item.action === ServiceAction.DELETE || item.action=== ServiceAction.UPDATE) {
+      return _.includes([JobStatus.FAILED, JobStatus.IN_PROGRESS, JobStatus.COMPLETED_WITH_ERRORS, JobStatus.PAUSE, JobStatus.COMPLETED], item.jobStatus);
+    }
+    return true;// ServiceAction.INSTANTIATE
   }
 
-  open(item): void {
-    let query =
-      `subscriberId=${item['subscriberName']}&` +
-      `serviceType=${item['serviceType']}&` +
-      `serviceInstanceId=${item['serviceInstanceId']}`;
+  isDeleteEnabled(item: ServiceInfoModel):boolean {
+    if( item.action === ServiceAction.DELETE || item.action === ServiceAction.UPDATE){
+      return _.includes([JobStatus.PENDING], item.jobStatus);
+    }
+    return _.includes([JobStatus.PENDING, JobStatus.STOPPED], item.jobStatus);
+  }
 
-    window.parent.location.assign('../../serviceModels.htm#/instantiate?' + query);
+  isHideEnabled(item: ServiceInfoModel):boolean {
+    return _.includes([JobStatus.COMPLETED, JobStatus.FAILED, JobStatus.STOPPED, JobStatus.COMPLETED_WITH_ERRORS], item.jobStatus);
   }
 
   public onContextMenu($event: MouseEvent, item: any): void {
@@ -129,17 +198,36 @@ export class InstantiationStatusComponent implements AfterViewChecked{
     return './' + imageName + '.svg';
   }
 
-  isHideEnabled(item: any):boolean {
-    return _.includes(['COMPLETED', 'FAILED', 'STOPPED'], item.jobStatus);
+  private getHeaderHeaderClientRect(): ClientRect {
+    const element = document.querySelector("#instantiation-status thead") as HTMLElement;
+    return element.getBoundingClientRect();
   }
-  scrollToElement() {
-    if(this.currentJobId){
+
+  findFirstVisibleJob(): HTMLElement {
+    const elements : any = document.querySelectorAll('#instantiation-status tr');
+    const headerRect = this.getHeaderHeaderClientRect();
+    if (headerRect) {
+      const topEdge = headerRect.bottom;
+      for (let i = 0; i < elements.length; i++) {
+        if (elements[i].getBoundingClientRect().top >= topEdge)
+          return elements[i];
+      }
+    }
+    return null;
+  }
+
+  scrollToElement(currentJob: HTMLElement) {
+    if (currentJob) {
       const config: ScrollToConfigOptions = {
-        target: this.currentJobId,
-        duration: 50,
-        offset: -35 //header height
+        target: currentJob,
+        duration: 0,
+        offset: -1 * (this.getHeaderHeaderClientRect().height + 2),
       };
-      this._scrollToService.scrollTo(config);
+
+      // wait after render
+      setTimeout(() => {
+        this._scrollToService.scrollTo(config);
+      }, 0)
     }
   }
 }
diff --git a/vid-webpack-master/src/app/modules/inputs.module.ts b/vid-webpack-master/src/app/modules/inputs.module.ts
deleted file mode 100644 (file)
index cb5f914..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-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
deleted file mode 100644 (file)
index a62fec6..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-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
deleted file mode 100644 (file)
index f734979..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-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
deleted file mode 100644 (file)
index a11f31e..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-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.service.ts b/vid-webpack-master/src/app/services/aaiService/aai.service.ts
deleted file mode 100644 (file)
index dd9d9fb..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-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/msoService/mso.service.ts b/vid-webpack-master/src/app/services/msoService/mso.service.ts
deleted file mode 100644 (file)
index 1402b50..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-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
deleted file mode 100644 (file)
index d4eba26..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-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
deleted file mode 100644 (file)
index 5d60e29..0000000
+++ /dev/null
@@ -1,467 +0,0 @@
-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
deleted file mode 100644 (file)
index 75720c8..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-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
deleted file mode 100644 (file)
index a69d91e..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-import { Injectable } from '@angular/core';
-
-@Injectable()
-export class ApiService {
-  title = 'Angular 2';
-}
@@ -8,14 +8,14 @@
       </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 id="service-model-name" class="row">{{type | uppercase}} MODEL: <span>{{serviceModelName}}</span></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">
+            <div class="row" *ngIf="showVidStatus"><span class="table-title">VID status</span></div>
+            <div class="row" *ngIf="showVidStatus">
               <table id="service-instantiation-audit-info-vid"  class="table table-bordered">
                 <thead class="thead-dark">
                 <tr class="row">
               <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>
+            <div class="row">
+              <div class="col-md-6 leftColumn"><span class="table-title">MSO status</span></div>
+              <div class="col-md-6 rightColumn"><span><a id="glossary_link" target="_blank" href="#" (click)="onNavigate()">Building Block (BB) glossary</a></span></div>
+            </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>
+                <th scope="col" class="request-id">Request ID</th>
+                <th *ngIf="isAlaCarte&&isALaCarteFlagOn" id="instanceName" class="col-md-2" scope="col">Instance Name</th>
+                <th class="col-md-2" scope="col">Status</th>
+                <th class="col-md-2" scope="col">Status time</th>
+                <th class="col-md-2" scope="col">Additional info</th>
               </tr>
               </thead>
               <tbody>
               <tr class="row" *ngFor="let data of msoInfoData">
-                <td class="col-md-3" id="msoRequestId">
+                <td id="msoRequestId" class="request-id">
                   <custom-ellipsis [id]="data?.requestId" [value]="data?.requestId"></custom-ellipsis>
                 </td>
-                <td class="col-md-3" id="msoJobStatus">
+                <td *ngIf="isAlaCarte && isALaCarteFlagOn" class="msoInstanceName col-md-2">
+                  <custom-ellipsis [id]="data?.instanceName" [value]="data?.instanceType + ': ' + data?.instanceName"></custom-ellipsis>
+                </td>
+                <td class="col-md-2" id="msoJobStatus">
                   <custom-ellipsis [id]="data?.jobStatus" [value]="data?.jobStatus | capitalizeAndFormat"></custom-ellipsis>
                 </td>
-                <td class="col-md-3" id="msoStatusTime">
+                <td class="col-md-2" 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">
+                <td class="col-md-2" id="msoAdditionalInfo">
                   <custom-ellipsis [id]="data?.additionalInfo" [value]="data?.additionalInfo"></custom-ellipsis>
                 </td>
               </tr>
             </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()">
+        <button style= "font-size: 12px" id="cancelButton" type="button" class="btn btn-default cancel" (click)="onCancelClick()">
           Close
         </button>
       </div>
 .modal{
 
   #audit-info-modal {
+    .leftColumn {
+      padding-left: 0;
+    }
 
+    .rightColumn {
+      padding-right: 0;
+      text-align: right;
+    }
     .modal-content{
       border-radius: 0px;
       border: none;
@@ -82,7 +89,9 @@
             overflow-x: auto;
             display: block;
             color: #5A5A5A;
-
+            .request-id {
+              width: 85px;
+            }
             thead {
               position: sticky;
               top: 0;
                   &:last-child{
                     border-right: none;
                   }
+                  &.request-id {
+                    flex-grow: 0;
+                  }
                 }
               }
             }
                 td {
                   border: none;
                   border-right: 1px solid #d2d2d2;
+                  flex-grow: 1;
                   &:last-child{
                     border-right: none;
                   }
+                  &.request-id {
+                    flex-grow: 0;
+                  }
                 }
               }
             }
diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.spec.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.spec.ts
new file mode 100644 (file)
index 0000000..35b5fbf
--- /dev/null
@@ -0,0 +1,274 @@
+
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {NgRedux} from "@angular-redux/store";
+import {AuditInfoModalComponentService} from "./auditInfoModal.component.service";
+import {ModelInformationItem} from "../model-information/model-information.component";
+
+class MockAppStore<T> {
+  getState() {
+    return {
+      "service": {
+        "serviceInstance": {
+          "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+            "instanceParams": [],
+            "bulkSize": 1,
+            "action": "None",
+            "instanceName": "PQijmEmzhVma4zujr",
+            "instanceId": "service-instance-id",
+            "orchStatus": "GARBAGE DATA",
+            "productFamilyId": null,
+            "lcpCloudRegionId": null,
+            "tenantId": null,
+            "modelInfo": {
+              "modelInvariantId": "d27e42cf-087e-4d31-88ac-6c4b7585f800",
+              "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "modelName": "vf_vEPDG",
+              "modelType": "service",
+              "modelVersion": "5.0"
+            },
+            "globalSubscriberId": "global-customer-id",
+            "subscriptionServiceType": "service-instance-type",
+            "owningEntityId": null,
+            "owningEntityName": null,
+            "tenantName": null,
+            "aicZoneId": null,
+            "aicZoneName": null,
+            "projectName": null,
+            "rollbackOnFailure": null,
+            "isALaCarte": false
+          }
+        },
+        "subscribers": [
+          {
+            "id": "CAR_2020_ER",
+            "name": "CAR_2020_ER",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "global-customer-id",
+            "name": "DALE BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-1",
+            "name": "LLOYD BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example",
+            "name": "JimmyExampleCust-20161102",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example2",
+            "name": "JimmyExampleCust-20161103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-102",
+            "name": "ERICA5779-TestSub-PWT-102",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-101",
+            "name": "ERICA5779-TestSub-PWT-101",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-4",
+            "name": "ERICA5779-Subscriber-5",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-103",
+            "name": "ERICA5779-TestSub-PWT-103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-2",
+            "name": "ERICA5779-Subscriber-2",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": true
+          },
+          {
+            "id": "ERICA5779-Subscriber-3",
+            "name": "ERICA5779-Subscriber-3",
+            "isPermitted": false
+          },
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          }
+        ]
+      }
+    }
+  }
+}
+
+describe("Audit info modal component service", () => {
+  let injector;
+  let httpMock: HttpTestingController;
+  let auditInfoModalComponentService: AuditInfoModalComponentService;
+
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [
+        AuditInfoModalComponentService,
+        {provide: NgRedux, useClass: MockAppStore}
+      ]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    httpMock = injector.get(HttpTestingController);
+    auditInfoModalComponentService = injector.get(AuditInfoModalComponentService);
+
+  })().then(done).catch(done.fail));
+
+
+  test('auditInfoModalComponentService service should be defined', () => {
+    expect(auditInfoModalComponentService).toBeDefined();
+  });
+
+  test('getModelInfo: VNF information from existing instance with model', () => {
+    const model = getVNFModel();
+    const instance = getVNFInstance();
+    const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44");
+    expect(results.find((item) => item.label === 'Model customization ID').values[0]).toEqual("91415b44-753d-494c-926a-456a9172bbb9");
+    expect(results.find((item) => item.label === 'Model version').values[0]).toEqual("2.0");
+    expect(results.find((item) => item.label === 'Model name').values[0]).toEqual("VF_vMee");
+    expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("4O61SmpFAdCm1oVEs");
+    expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("66cbb3b5-c823-470c-9520-4e0b85112250");
+    expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber
+    expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type");
+  });
+
+  test('getModelInfo: Network information from existing instance without model', () => {
+    const model = getNetworkModel();
+    const instance = getNetworkInstance();
+    const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44");
+    expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("KADmyK6e3sVWNfGbA");
+    expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("712cad2d-fc1c-40c7-aaff-d2d6e17ac2b6");
+    expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber
+    expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type");
+  });
+
+  test('getModelInfo: VFModule information from existing instance with model', () => {
+    const model = getVFModule();
+    const instance = getVFModuleInstance();
+    const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44");
+    expect(results.find((item) => item.label === 'Model customization ID').values[0]).toEqual("55b1be94-671a-403e-a26c-667e9c47d091");
+    expect(results.find((item) => item.label === 'Model version').values[0]).toEqual("2");
+    expect(results.find((item) => item.label === 'Model name').values[0]).toEqual("VfVmee..vmme_vlc..module-1");
+    expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("ss820f_0918_db");
+    expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("2c1ca484-cbc2-408b-ab86-25a2c15ce280");
+    expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber
+    expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type");
+  });
+
+  test('getModelInfo: VNFGroup information from existing instance with model', () => {
+    const model = getVNFGroupModel();
+    const instance = getVNFGroupInstance();
+    const results: ModelInformationItem[] = auditInfoModalComponentService.getModelInfo(model, instance, "6e59c5de-f052-46fa-aa7e-2fca9d674c44");
+    expect(results.find((item) => item.label === 'Model version').values[0]).toEqual("1");
+    expect(results.find((item) => item.label === 'Model name').values[0]).toEqual("groupingservicefortest..ResourceInstanceGroup..0");
+    expect(results.find((item) => item.label === 'Instance name').values[0]).toEqual("VNF_GROUP1_INSTANCE_NAME");
+    expect(results.find((item) => item.label === 'Instance ID').values[0]).toEqual("VNF_GROUP1_INSTANCE_ID");
+    expect(results.find((item) => item.label === 'Subscriber name').values[0]).toEqual("DALE BRIDGES"); // TODO should call subscriber
+    expect(results.find((item) => item.label === 'Service type').values[0]).toEqual("service-instance-type");
+  });
+
+
+  test('setModalTitlesType:  should return modal title', () => {
+    expect(AuditInfoModalComponentService.setModalTitle('VNF')).toEqual('VNF Instantiation Information');
+    expect(AuditInfoModalComponentService.setModalTitle('VFMODULE')).toEqual('VfModule Instantiation Information');
+    expect(AuditInfoModalComponentService.setModalTitle('NETWORK')).toEqual('Network Instantiation Information');
+    expect(AuditInfoModalComponentService.setModalTitle('VNFGROUP')).toEqual('Vnf Group Instantiation Information');
+  });
+
+  test('setModalTitlesType:  should return modal title type', () => {
+    expect(AuditInfoModalComponentService.setModalTitlesType('VNF')).toEqual('VNF');
+    expect(AuditInfoModalComponentService.setModalTitlesType('VFMODULE')).toEqual('VfModule');
+    expect(AuditInfoModalComponentService.setModalTitlesType('NETWORK')).toEqual('Network');
+    expect(AuditInfoModalComponentService.setModalTitlesType('VNFGROUP')).toEqual('Vnf Group');
+  });
+
+  test('getInstanceModelName:  should return model name if exist', () => {
+    expect(AuditInfoModalComponentService.getInstanceModelName({name : 'some name'})).toEqual('some name');
+    expect(AuditInfoModalComponentService.getInstanceModelName(null)).toEqual('');
+  });
+
+  test('createModelInformationItemsJob:  should return job information', () => {
+    let service = {
+      "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+      "invariantUuid": "cfef8302-d90f-475f-87cc-3f49a62ef14c",
+      "name": "ComplexService",
+      "version": "1.0",
+      "toscaModelURL": null,
+      "category": "Emanuel",
+      "serviceType": "",
+      "serviceRole": "",
+      "description": "ComplexService",
+      "serviceEcompNaming": "true",
+      "instantiationType": "Macro",
+      "inputs": {},
+      "vidNotions": {
+        "instantiationUI": "legacy",
+        "modelCategory": "other",
+        "viewEditUI": "legacy"
+      }
+    };
+    const results = AuditInfoModalComponentService.createModelInformationItemsJob(<any>service);
+  });
+
+
+  function getVNFModel(){
+    return {"name":"VF_vMee","version":"2.0","description":"VSP_vMee","uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","max":1,"min":0,"customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","isEcompGeneratedNaming":true,"type":"VF","modelCustomizationName":"VF_vMee 0","vfcInstanceGroups":{},"properties":{"gpb2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-egress_rule_application":"any","sctp-b-ipv6-egress_src_start_port":"0","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","ncb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress_rule_protocol":"icmp","sctp-b-ingress_action":"pass","sctp-a-egress_rule_application":"any","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-egress_src_addresses":"local","fsb_volume_size_0":"320.0","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-egress_src_addresses":"local","sctp-b-egress-src_start_port":"0.0","sctp-a-ingress_rule_protocol":"icmp","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-a-ingress_ethertype":"IPv4","sctp-a-egress-src_start_port":"0.0","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","sctp-b-egress_dst_subnet_prefix_len":"0.0","gpb1_Internal1_mac":"00:11:22:EF:AC:DF","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-egress-dst_start_port":"0.0","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-egress_action":"pass","sctp-b-ipv6-egress_rule_application":"any","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress-src_start_port":"0.0","fsb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-a-ipv6-ingress_rule_application":"any","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","ecomp_generated_naming":"true","sctp-a-IPv6_ethertype":"IPv6","vlc_st_virtualization_type":"virtual-machine","vlc2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-dst_end_port":"65535.0","sctp-b-ingress-dst_start_port":"0.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","vlc_flavor_name":"nd.c16r64d1","int2_sec_group_name":"int2-sec-group","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress-dst_start_port":"0","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_shared":"false","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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","fsb2_Internal2_mac":"00:11:22:EF:AC:DF","Internal2_forwarding_mode":"l2","sctp-a-ipv6-egress_dst_end_port":"65535","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","sctp-a-ingress_dst_addresses":"local","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:11:22:EF:AC:DF","vlc_st_interface_type_sctp_a":"left","vlc_st_version":"2","sctp-a-src_subnet_prefix_v6":"::","vlc_st_interface_type_sctp_b":"right","sctp-a-ingress_rule_application":"any","sctp-b-egress_ethertype":"IPv4","sctp-a-ipv6-egress_src_start_port":"0","instance_ip_family_v6":"v6","gpb1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ingress-src_start_port":"0.0","fsb1_Internal1_mac":"00:11:22:EF:AC:DF","sctp-b-ingress_dst_addresses":"local","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","Internal1_net_gateway":"10.0.0.10","sctp-b-ipv6-egress-dst_start_port":"0","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-a-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-b-ipv6-egress_action":"pass","sctp-a-egress_rule_protocol":"icmp","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-b-egress_rule_protocol":"icmp","sctp-a-ingress_action":"pass","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","vlc2_Internal2_mac":"00:11:22:EF:AC:DF","sctp-b-ipv6-ingress-dst_start_port":"0","vlc_st_availability_zone":"true","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","gpb_flavor_name":"nv.c20r64d1","Internal1_allow_transit":"true","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-ingress_ethertype":"IPv4","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","vlc1_Internal2_mac":"00:11:22:EF:AC:DF","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-ingress-src_end_port":"65535.0","sctp-b-egress_rule_application":"any","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"}};
+  }
+
+  function getVNFInstance(){
+    return {"action":"None","instanceName":"4O61SmpFAdCm1oVEs","instanceId":"66cbb3b5-c823-470c-9520-4e0b85112250","orchStatus":null,"productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationName":"VF_vMee 0","modelInvariantId":"vnf-instance-model-invariant-id","modelVersionId":"d6557200-ecf2-4641-8094-5393ae3aae60","modelType":"vnf"},"instanceType":"7538ifdSoTccmbEkr","provStatus":null,"inMaint":true,"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","originalName":"VF_vMee 0","legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"VF_vMee 0:004","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"vf_vmee0..VfVmee..vmme_vlc..module-1:008":{"action":"None","instanceName":"ss820f_0918_db","instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280","orchStatus":"deleted","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationName":"VfVmee..vmme_vlc..module-1","modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9","modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelType":"vfModule"},"instanceType":null,"provStatus":null,"inMaint":true,"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","originalName":"VfVmee..vmme_vlc..module-1","legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008","isBase":false,"volumeGroupName":null}},"dc229cd8-c132-4455-8517-5c1787c18b14":{"dc229cd8-c132-4455-8517-5c1787c18b14:009":{"action":"None","instanceName":"ss820f_0918_base","instanceId":"3ef042c4-259f-45e0-9aba-0989bd8d1cc5","orchStatus":"Assigned","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationId":"8ad8670b-0541-4499-8101-275bbd0e8b6a","modelInvariantId":"1e463c9c-404d-4056-ba56-28fd102608de","modelVersionId":"dc229cd8-c132-4455-8517-5c1787c18b14","modelType":"vfModule"},"instanceType":null,"provStatus":null,"inMaint":false,"uuid":"dc229cd8-c132-4455-8517-5c1787c18b14","originalName":null,"legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"dc229cd8-c132-4455-8517-5c1787c18b14:009","isBase":true,"volumeGroupName":null}}},"networks":{}};
+  }
+
+  function getVFModule(){
+    return {"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","baseModule":false},"inputs":{},"volumeGroupAllowed":false};
+  }
+
+  function getVFModuleInstance() {
+    return{"action":"None","instanceName":"ss820f_0918_db","instanceId":"2c1ca484-cbc2-408b-ab86-25a2c15ce280","orchStatus":"deleted","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelCustomizationName":"VfVmee..vmme_vlc..module-1","modelCustomizationId":"b200727a-1bf9-4e7c-bd06-b5f4c9d920b9","modelInvariantId":"09edc9ef-85d0-4b26-80de-1f569d49e750","modelVersionId":"522159d5-d6e0-4c2a-aa44-5a542a12a830","modelType":"vfModule"},"instanceType":null,"provStatus":null,"inMaint":true,"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","originalName":"VfVmee..vmme_vlc..module-1","legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"vf_vmee0..VfVmee..vmme_vlc..module-1:008","isBase":false,"volumeGroupName":null};
+  }
+
+  function getNetworkModel(){
+    return null;
+  }
+
+  function getNetworkInstance(){
+      return {"action":"None","instanceName":"KADmyK6e3sVWNfGbA","instanceId":"712cad2d-fc1c-40c7-aaff-d2d6e17ac2b6","orchStatus":"Assigned","productFamilyId":null,"lcpCloudRegionId":null,"tenantId":null,"modelInfo":{"modelInvariantId":"network-instance-model-invariant-id","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelType":"network"},"instanceType":"CONTRAIL30_BASIC","provStatus":"nvtprov","inMaint":false,"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","originalName":null,"legacyRegion":null,"lineOfBusiness":null,"platformName":null,"trackById":"ddc3f20c-08b5-40fd-af72-c6d14636b986:001"};
+  }
+
+  function getVNFGroupModel(){
+    return {"name":"groupingservicefortest..ResourceInstanceGroup..0","version":"1","uuid":"daeb6568-cef8-417f-9075-ed259ce59f48","invariantUuid":"4bb2e27e-ddab-4790-9c6d-1f731bc14a45","max":1,"min":0,"isEcompGeneratedNaming":true,"type":"VnfGroup","modelCustomizationName":"groupingservicefortest..ResourceInstanceGroup..0","properties":{"contained_resource_type":"VF","role":"SERVICE-ACCESS","function":"DATA","description":"DDD0","type":"LOAD-GROUP","ecomp_generated_naming":"true"},"members":{"vdbe_svc_vprs_proxy 0":{"uuid":"65fadfa8-a0d9-443f-95ad-836cd044e26c","invariantUuid":"f4baae0c-b3a5-4ca1-a777-afbffe7010bc","description":"A Proxy for Service vDBE_Svc_vPRS","name":"vDBE_Svc_vPRS Service Proxy","version":"1.0","customizationUuid":"bdb63d23-e132-4ce7-af2c-a493b4cafac9","inputs":{},"commands":{},"properties":{"ecomp_generated_naming":"false"},"type":"Service Proxy","sourceModelUuid":"da7827a2-366d-4be6-8c68-a69153c61274","sourceModelInvariant":"24632e6b-584b-4f45-80d4-fefd75fd9f14","sourceModelName":"vDBE_Svc_vPRS"}}};
+  }
+
+  function getVNFGroupInstance(){
+    return {"originalName":"groupingservicefortest..ResourceInstanceGroup..0","trackById":"groupingservicefortest..ResourceInstanceGroup..0:001","instanceName":"VNF_GROUP1_INSTANCE_NAME","action":"None","instanceId":"VNF_GROUP1_INSTANCE_ID","instanceType":"VNF_GROUP1_INSTANCE_TYPE","orchStatus":"Active","provStatus":null,"inMaint":false,"modelInfo":{"modelType":"instanceGroup","modelCustomizationName":"groupingservicefortest..ResourceInstanceGroup..0","modelInvariantId":"4bb2e27e-ddab-4790-9c6d-1f731bc14a45","modelVersionId":"daeb6568-cef8-417f-9075-ed259ce59f48"},"uuid":"daeb6568-cef8-417f-9075-ed259ce59f48","vnfs":{}};
+  }
+});
diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.service.ts
new file mode 100644 (file)
index 0000000..cd36ece
--- /dev/null
@@ -0,0 +1,79 @@
+import {Injectable} from "@angular/core";
+import {ModelInformationItem} from "../model-information/model-information.component";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {Subscriber} from "../../models/subscriber";
+import {ServiceInfoModel} from "../../server/serviceInfo/serviceInfo.model";
+import * as _ from 'lodash';
+
+@Injectable()
+export class AuditInfoModalComponentService {
+  constructor(private _store: NgRedux<AppState>){}
+
+  getModelInfo(model, instance, serviceModelId: string): ModelInformationItem[] {
+    const serviceInstance = this._store.getState().service.serviceInstance[serviceModelId];
+    const modelInformation = !_.isNil(model) ? [
+      new ModelInformationItem('Model name', 'model_name', [model.name]),
+      new ModelInformationItem('Model version', 'model_version', [model.version]),
+      new ModelInformationItem('Model customization ID', 'model_customization_ID', [model.customizationUuid]),
+      new ModelInformationItem('Base module', 'base_module', [!_.isNil(model.properties) ? model.properties.baseModule : null])
+    ] : [];
+
+    const instanceInfo = !_.isNil(instance) ? [
+      new ModelInformationItem('Instance name', 'instance_name', [instance.instanceName]),
+      new ModelInformationItem('Instance ID', 'instance_ID', [instance.instanceId])
+    ] : [];
+
+    const serviceInfo = !_.isNil(serviceInstance) ? [
+      new ModelInformationItem("Subscriber name", "subscriberName", [this.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId, this._store)]),
+      new ModelInformationItem('Service type', 'service_type', [serviceInstance.subscriptionServiceType])
+    ] : [];
+
+    const result = [modelInformation, instanceInfo, serviceInfo];
+    return _.uniq(_.flatten(result));
+  }
+
+  static createModelInformationItemsJob(serviceModel: ServiceInfoModel): 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 || 'Automatically generated'], '', true),
+      new ModelInformationItem('Service instance ID', 'serviceInstanceId', [serviceModel.serviceInstanceId]),
+      new ModelInformationItem('Requestor User ID', 'userId', [serviceModel.userId]),
+    ];
+  }
+
+  static getInstanceModelName(model) : string {
+    return !_.isNil(model) && model.name ? model.name : '';
+  }
+
+  static setModalTitlesType(type : string) : string {
+    return !_.isNil(type) ? AuditInfoModalComponentService.getTypeMap()[type] : 'Service' ;
+  }
+
+  static getTypeMap(){
+    return {
+      SERVICE : 'Service',
+      VNFGROUP : 'Vnf Group',
+      NETWORK : 'Network',
+      VFMODULE : 'VfModule',
+      VNF : 'VNF'
+    };
+  }
+
+  static setModalTitle(type : string) : string {
+    return !_.isNil(type) ? (AuditInfoModalComponentService.getTypeMap()[type] + " Instantiation Information") : 'Service Instantiation Information';
+  }
+
+  extractSubscriberNameBySubscriberId(subscriberId: string, store: NgRedux<AppState>) {
+    let result: string = null;
+    let filteredArray: any = _.filter(store.getState().service.subscribers, function (o: Subscriber) {
+      return o.id === subscriberId
+    });
+    if (filteredArray.length > 0) {
+      result = filteredArray[0].name;
+    }
+    return result;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.spec.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.spec.ts
new file mode 100644 (file)
index 0000000..ecce68d
--- /dev/null
@@ -0,0 +1,203 @@
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import {ContextMenuModule, ContextMenuService} from 'ngx-contextmenu';
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {AuditInfoModalComponent} from "./auditInfoModal.component";
+import {NgRedux} from "@angular-redux/store";
+import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {HttpClientTestingModule} from "@angular/common/http/testing";
+import {ScrollToModule} from "@nicky-lenaers/ngx-scroll-to";
+import {RouterTestingModule} from "@angular/router/testing";
+import {ModalModule} from "ngx-bootstrap";
+import {CapitalizeAndFormatPipe} from "../../pipes/capitalize/capitalize-and-format.pipe";
+import {ServiceInfoService} from "../../server/serviceInfo/serviceInfo.service";
+import {IframeService} from "../../utils/iframe.service";
+import {AuditInfoModalComponentService} from "./auditInfoModal.component.service";
+import {ServiceInfoModel} from "../../server/serviceInfo/serviceInfo.model";
+import {HttpClient} from '@angular/common/http';
+import {getTestBed} from "@angular/core/testing";
+import {of} from 'rxjs';
+
+class MockAppStore<T> {
+  getState() {
+    return {
+      global: {
+        flags: {
+          'FLAG_1902_NEW_VIEW_EDIT': true
+        }
+      },
+      service: {
+        serviceInstance: {}
+      }
+    }
+  }
+
+  dispatch() {
+
+  }
+}
+
+
+describe('Audit Info Modal Component_serviceInfoService', () => {
+  let component: AuditInfoModalComponent;
+  let fixture: ComponentFixture<AuditInfoModalComponent>;
+  let _serviceInfoService: ServiceInfoService;
+  let injector;
+  beforeAll(done => (async () => {
+
+    TestBed.configureTestingModule({
+      imports: [
+        HttpClientTestingModule,
+        ContextMenuModule,
+        ScrollToModule.forRoot(),
+        RouterTestingModule,
+        ModalModule.forRoot()
+      ],
+      providers: [
+        ServiceInfoService,
+        AaiService,
+        IframeService,
+        AuditInfoModalComponentService,
+        ContextMenuService,
+        FeatureFlagsService,
+        {provide: NgRedux, useClass: MockAppStore}
+      ],
+      declarations: [AuditInfoModalComponent, CapitalizeAndFormatPipe],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    _serviceInfoService = injector.get(ServiceInfoService);
+    fixture = TestBed.createComponent(AuditInfoModalComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  })().then(done).catch(done.fail));
+
+
+  test('component should be defined', () => {
+    expect(component).toBeDefined();
+  });
+
+  test('setModalTitles should set modal title according to type', () => {
+    component.setModalTitles('VNF');
+    expect(component.type).toEqual('VNF');
+    expect(component.title).toEqual('VNF Instantiation Information');
+  });
+
+  test('initializeProperties should init some component properties', () => {
+    component.initializeProperties();
+    expect(component.modelInfoItems).toBeNull();
+    expect(component.vidInfoData).toEqual([]);
+    expect(component.msoInfoData).toEqual([]);
+    expect(component.isLoading).toEqual(true);
+  });
+
+  test('openAuditInfoModal', () => {
+    const jobData: ServiceInfoModel = new ServiceInfoModel();
+    spyOn(AuditInfoModalComponentService, 'createModelInformationItemsJob');
+    spyOn(component, 'initAuditInfoData');
+    spyOn(component.auditInfoModal, 'show');
+    component.openAuditInfoModal(jobData);
+
+    expect(AuditInfoModalComponentService.createModelInformationItemsJob).toHaveBeenCalledWith(jobData);
+    expect(component.initAuditInfoData).toHaveBeenCalledWith(jobData);
+    expect(component.auditInfoModal.show).toHaveBeenCalled();
+  });
+
+  test('onCancelClick', () => {
+    spyOn(component, 'initializeProperties');
+    spyOn(component.auditInfoModal, 'hide');
+    component.onCancelClick();
+
+    expect(component.initializeProperties).toHaveBeenCalledWith();
+    expect(component.auditInfoModal.hide).toHaveBeenCalled();
+  });
+
+  test('openInstanceAuditInfoModal calls to getAuditStatusForRetry function', () => {
+    spyOn(component.auditInfoModalComponentService, 'getModelInfo').and.returnValue([]);
+    spyOn(component, 'initializeProperties');
+    spyOn(component, 'setModalTitles');
+    spyOn(component.auditInfoModal, 'show');
+    spyOn(_serviceInfoService, 'getAuditStatusForRetry');
+    jest.spyOn(_serviceInfoService, 'getAuditStatusForRetry').mockReturnValue(of([]))
+
+    spyOn(AuditInfoModalComponentService, 'getInstanceModelName');
+    const instanceId: string = "instanceID";
+    const type: string = 'VNF';
+    const model = {};
+    const instance = {};
+    const isInstanceFailed: boolean = true;
+    const trackById = "trackById";
+
+    AuditInfoModalComponent.openInstanceAuditInfoModal.next({
+      instanceId: instanceId,
+      type: type,
+      model: model,
+      instance: instance,
+      isInstanceFailed: isInstanceFailed,
+      trackById: trackById
+    });
+
+    expect(component.showVidStatus).toEqual(false);
+    expect(component.initializeProperties).toHaveBeenCalled();
+    expect(component.setModalTitles).toHaveBeenCalled();
+    expect(_serviceInfoService.getAuditStatusForRetry).toHaveBeenCalledWith(trackById);
+    expect(component.auditInfoModal.show).toHaveBeenCalled();
+    expect(AuditInfoModalComponentService.getInstanceModelName).toHaveBeenCalledWith(model);
+  });
+
+  test('openInstanceAuditInfoModal calls to getInstanceAuditStatus function', () => {
+    spyOn(component.auditInfoModalComponentService, 'getModelInfo').and.returnValue([]);
+    spyOn(component, 'initializeProperties');
+    spyOn(component, 'setModalTitles');
+    spyOn(component.auditInfoModal, 'show');
+    spyOn(_serviceInfoService, 'getAuditStatusForRetry');
+    jest.spyOn(_serviceInfoService, 'getInstanceAuditStatus').mockReturnValue(of([]))
+
+    spyOn(AuditInfoModalComponentService, 'getInstanceModelName');
+    const instanceId: string = "instanceID";
+    const type: string = 'VNF';
+    const model = {};
+    const instance = {};
+    const isInstanceFailed: boolean = false;
+    const trackById = "trackById";
+
+    AuditInfoModalComponent.openInstanceAuditInfoModal.next({
+      instanceId: instanceId,
+      type: type,
+      model: model,
+      instance: instance,
+      isInstanceFailed: isInstanceFailed,
+      trackById: trackById
+    });
+
+    expect(component.showVidStatus).toEqual(false);
+    expect(component.initializeProperties).toHaveBeenCalled();
+    expect(component.setModalTitles).toHaveBeenCalled();
+    expect(_serviceInfoService.getInstanceAuditStatus).toHaveBeenCalledWith(instanceId, type);
+    expect(component.auditInfoModal.show).toHaveBeenCalled();
+    expect(AuditInfoModalComponentService.getInstanceModelName).toHaveBeenCalledWith(model);
+  });
+
+  test('openInstanceAuditInfoModal : openModal : with job data', () => {
+    spyOn(component.auditInfoModalComponentService, 'getModelInfo').and.returnValue([]);
+    spyOn(component, 'initializeProperties');
+    spyOn(component.auditInfoModal, 'show');
+    spyOn(AuditInfoModalComponentService, 'getInstanceModelName');
+    const jobData: ServiceInfoModel = new ServiceInfoModel();
+    jobData.aLaCarte = true;
+    AuditInfoModalComponent.openModal.next(jobData);
+
+    expect(component.showVidStatus).toEqual(true);
+    expect(component.initializeProperties).toHaveBeenCalled();
+    expect(component.auditInfoModal.show).toHaveBeenCalled();
+  });
+
+  test('openInstanceAuditInfoModal : openModal : without job data', () => {
+    spyOn(component.auditInfoModal, 'hide');
+    const jobData: ServiceInfoModel = null;
+    AuditInfoModalComponent.openModal.next(jobData);
+    expect(component.auditInfoModal.hide).toHaveBeenCalled();
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.ts b/vid-webpack-master/src/app/shared/components/auditInfoModal/auditInfoModal.component.ts
new file mode 100644 (file)
index 0000000..cf385d7
--- /dev/null
@@ -0,0 +1,122 @@
+import {Component, ViewChild} from '@angular/core';
+import {Subject} from 'rxjs/Subject';
+import {ModalDirective} from 'ngx-bootstrap'
+import {ModelInformationItem} from '../model-information/model-information.component';
+import {ServiceModel} from '../../models/serviceModel';
+import {ServiceInfoService} from '../../server/serviceInfo/serviceInfo.service';
+import {ServiceInfoModel} from '../../server/serviceInfo/serviceInfo.model';
+import {AuditStatus} from '../../server/serviceInfo/AuditStatus.model';
+import {IframeService} from "../../utils/iframe.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {AuditInfoModalComponentService} from "./auditInfoModal.component.service";
+
+@Component({
+  selector: 'audit-info-modal',
+  templateUrl: './auditInfoModal.component.html',
+  styleUrls: ['./auditInfoModal.component.scss']
+})
+export class AuditInfoModalComponent {
+  static openModal: Subject<ServiceInfoModel> = new Subject<ServiceInfoModel>();
+  static openInstanceAuditInfoModal: Subject<{instanceId , type, model, instance, isInstanceFailed?, trackById?}> = new Subject<{instanceId , type, model, instance, isInstanceFailed, trackById}>();
+  @ViewChild('auditInfoModal') public auditInfoModal: ModalDirective;
+  title: string = 'Service Instantiation Information';
+  modelInfoItems: ModelInformationItem[] = [];
+  serviceModel: ServiceModel;
+  serviceModelName: string;
+  vidInfoData: AuditStatus[] = [];
+  msoInfoData: AuditStatus[] = [];
+  isAlaCarte: boolean;
+  parentElementClassName = 'content';
+  isLoading = true;
+  model: any;
+  instanceId: string;
+  isALaCarteFlagOn: boolean;
+  type : string = "Service";
+  showVidStatus : boolean = true;
+  auditInfoModalComponentService : AuditInfoModalComponentService;
+  constructor(private _serviceInfoService: ServiceInfoService, private _iframeService : IframeService,
+              private _auditInfoModalComponentService : AuditInfoModalComponentService,
+              private store: NgRedux<AppState>) {
+    this.auditInfoModalComponentService = this._auditInfoModalComponentService;
+    AuditInfoModalComponent.openModal.subscribe((jobData: ServiceInfoModel) => {
+      this.isALaCarteFlagOn = this.store.getState().global.flags['FLAG_A_LA_CARTE_AUDIT_INFO'];
+      this.initializeProperties();
+      this.showVidStatus = true;
+      if (jobData) {
+        this.isAlaCarte = jobData.aLaCarte;
+        this.openAuditInfoModal(jobData);
+        _iframeService.addClassOpenModal(this.parentElementClassName);
+        this.serviceModelName = jobData.serviceModelName ? jobData.serviceModelName : '';
+        this.auditInfoModal.show();
+      } else {
+        _iframeService.removeClassCloseModal(this.parentElementClassName);
+        this.auditInfoModal.hide();
+      }
+    });
+
+    AuditInfoModalComponent.openInstanceAuditInfoModal.subscribe(({instanceId  , type ,  model, instance, isInstanceFailed, trackById}) => {
+      this.showVidStatus = false;
+      this.initializeProperties();
+      this.setModalTitles(type);
+      this.serviceModelName = AuditInfoModalComponentService.getInstanceModelName(model);
+
+      if (isInstanceFailed) {
+        this._serviceInfoService.getAuditStatusForRetry(trackById).subscribe((res: AuditStatus) => {
+          this.msoInfoData = [res];
+        });
+      }else{
+        this._serviceInfoService.getInstanceAuditStatus(instanceId, type).subscribe((res : AuditStatus[]) =>{
+          this.msoInfoData = res;
+       });
+      }
+      this.modelInfoItems = this.auditInfoModalComponentService.getModelInfo(model, instance, instanceId);
+      _iframeService.addClassOpenModal(this.parentElementClassName);
+      this.auditInfoModal.show();
+    });
+  }
+
+
+  setModalTitles(type : string) : void{
+    this.type = AuditInfoModalComponentService.setModalTitlesType(type) ;
+    this.title = AuditInfoModalComponentService.setModalTitle(type);
+  }
+
+  initializeProperties() : void {
+    this.modelInfoItems = null;
+    this.vidInfoData = [];
+    this.msoInfoData = [];
+    this.isLoading = true;
+  }
+
+  openAuditInfoModal(jobData: ServiceInfoModel): void {
+    this.modelInfoItems = AuditInfoModalComponentService.createModelInformationItemsJob(jobData);
+    this.initAuditInfoData(jobData);
+    this.auditInfoModal.onHide.subscribe(()=>{
+      this._iframeService.removeClassCloseModal(this.parentElementClassName);
+      this.initializeProperties();
+    });
+    this.auditInfoModal.show();
+  }
+
+  initAuditInfoData(jobData: ServiceInfoModel) {
+    this._serviceInfoService.getJobAuditStatus(jobData)
+      .subscribe((res: AuditStatus[][]) => {
+        this.vidInfoData = res[0];
+        this.msoInfoData = res[1];
+        this.isLoading = false;
+      });
+  }
+
+  onCancelClick() {
+    this._iframeService.removeClassCloseModal(this.parentElementClassName);
+    this.initializeProperties();
+    this.auditInfoModal.hide();
+  }
+
+
+  onNavigate(){
+    window.open("https://wiki.onap.org/display/DW/SO+Building+blocks", "_blank");
+  }
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.spec.ts b/vid-webpack-master/src/app/shared/components/dynamic-inputs/dynamic-inputs.component.spec.ts
new file mode 100644 (file)
index 0000000..6194aad
--- /dev/null
@@ -0,0 +1,157 @@
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {DynamicInputsComponent} from "./dynamic-inputs.component";
+import {async, ComponentFixture, getTestBed, TestBed} from "@angular/core/testing";
+import {CUSTOM_ELEMENTS_SCHEMA} from "@angular/core";
+import {FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, ValidatorFn} from "@angular/forms";
+import {BrowserModule} from "@angular/platform-browser";
+import {CommonModule} from "@angular/common";
+import {RouterTestingModule} from "@angular/router/testing";
+import {DynamicInputLabelPipe} from "../../pipes/dynamicInputLabel/dynamic-input-label.pipe";
+import {DynamicNumber} from "../../models/dynamicInput";
+
+
+describe('DynamicInputs Component', () => {
+  let component: DynamicInputsComponent;
+  let fixture: ComponentFixture<DynamicInputsComponent>;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [BrowserModule, CommonModule, FormsModule, HttpClientTestingModule, RouterTestingModule, ReactiveFormsModule],
+      declarations: [DynamicInputsComponent, DynamicInputLabelPipe],
+      providers : [FormBuilder],
+      schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
+    });
+    await TestBed.compileComponents();
+
+    fixture = TestBed.createComponent(DynamicInputsComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  })().then(done).catch(done.fail));
+
+  test('should be defined', () => {
+    expect(component).toBeDefined();
+  });
+
+  test('isDynamicNumber should return item', () => {
+    let options = {
+      minLength : 10,
+      maxLength : 10
+    };
+
+    let dynamicNumber : DynamicNumber = new DynamicNumber(<any>options);
+    expect(component.isDynamicNumber(dynamicNumber)).toBeDefined();
+  });
+
+  test('buildValidators should return validator', () => {
+    let options = {
+      minLength : 10,
+      maxLength : 10,
+      max : 10,
+      min : 1
+    };
+
+    let dynamicNumber : DynamicNumber = new DynamicNumber(<any>options);
+    let validator : ValidatorFn = component.buildValidators(dynamicNumber);
+    expect(validator).toBeDefined();
+  });
+
+
+  test('ngOnInit', ()=>{
+    component.group = new FormGroup({
+
+    });
+      component.list = [
+        {
+          type : 'select',
+          value : 'optionName',
+          name : 'multiSelectControl',
+          optionList : [{
+            isDataLoading : true,
+            name : 'optionName',
+            id : 'id'
+          }]
+        },
+        {
+          type : 'select',
+          value : 'optionName',
+          name : 'multiSelectControl',
+          optionList : [{
+            isDataLoading : true,
+            name : 'optionName',
+            id : 'id'
+          }]
+        },
+        {
+          type : 'multi_select',
+          value : 'optionName',
+          name : 'selectControl',
+          optionList : [{
+            isDataLoading : true,
+            name : 'optionName',
+            id : 'id'
+          }]
+        },
+        {
+          type : 'multi_select',
+          value : 'optionName',
+          name : 'selectControl',
+          optionList : [{
+            isDataLoading : true,
+            name : 'optionName'
+          }]
+        },
+        {
+          type : 'boolean',
+          value : true,
+          name : 'booleanControl'
+        },
+        {
+          type : 'boolean',
+          name : 'booleanControl2'
+        },
+        {
+          type : 'number',
+          value : 100,
+          name : 'numberControl'
+        },
+        {
+          type : 'file',
+          value : 'someValue',
+          name : 'fileControl'
+        },
+        {
+          type : 'checkbox',
+          value : true,
+          name : 'checkboxControl'
+        },
+        {
+          type : 'map',
+          value : true,
+          name : 'mapControl'
+        },
+        {
+          type : 'list',
+          value : true,
+          name : 'listControl'
+        },
+        {
+          type : 'default',
+          value : true,
+          name : 'defaultControl'
+        }
+      ];
+
+      component.ngOnInit();
+      expect(component.group.controls['multiSelectControl'].value).toEqual('id');
+      expect(component.group.controls['selectControl'].value).toEqual('optionName');
+      expect(component.group.controls['booleanControl'].value).toEqual(true);
+      expect(component.group.controls['booleanControl2'].value).toEqual(false);
+      expect(component.group.controls['numberControl'].value).toEqual(100);
+      expect(component.group.controls['fileControl'].value).toEqual('someValue');
+      expect(component.group.controls['checkboxControl'].value).toEqual(true);
+      expect(component.group.controls['mapControl'].value).toEqual(true);
+      expect(component.group.controls['listControl'].value).toEqual(true);
+      expect(component.group.controls['defaultControl'].value).toEqual(true);
+  })
+
+});
@@ -1,6 +1,6 @@
 import {Component, Input, OnInit} from '@angular/core';
 import {FormControl, FormGroup, Validators} from "@angular/forms";
-import {DynamicInput, DynamicMultiSelect, DynamicNumber, DynamicSelect} from "../../shared/models/dynamicInput";
+import {DynamicInput, DynamicMultiSelect, DynamicNumber, DynamicSelect} from "../../models/dynamicInput";
 
 @Component({
   selector: 'dynamic-inputs',
@@ -1,6 +1,6 @@
 <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>
+    <label  [ngClass]="{'required' : item.isRequired && item.isVisible}">{{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>
index fd58b65..bce0695 100644 (file)
@@ -1,12 +1,17 @@
-import { Component, Input } from '@angular/core';
+import {Component, Input, OnChanges, SimpleChanges} from '@angular/core';
+import {HighlightPipe} from "../../pipes/highlight/highlight-filter.pipe";
+import * as _ from 'lodash';
 
 @Component({
   selector : 'custom-ellipsis',
   template: `
-    <span 
+    <span
+          sdc-tooltip
           class="ellipsis"
           id="{{id}}"
-          tooltip="{{value}}">{{value}}</span>`,
+          [innerHtml]="displayValue | safe : 'html'"
+          [tooltip-text]="value">
+      </span>`,
   styles : [
     `
       .ellipsis {
@@ -18,10 +23,23 @@ import { Component, Input } from '@angular/core';
         text-align: left;
       }
     `
-  ]
+  ],
+  providers : [HighlightPipe]
 })
-export class EllipsisComponent {
+export class EllipsisComponent implements OnChanges{
   @Input() value : string;
   @Input() id : string;
+  @Input() hightlight : string;
 
+  displayValue : string;
+  constructor(private _highlightPipe : HighlightPipe){
+    this.displayValue = this.value;
+  }
+
+  ngOnChanges(changes: SimpleChanges): void {
+    this.displayValue = this.value;
+    if(!_.isNil(this.hightlight)){
+      this.displayValue = this._highlightPipe.transform(this.value ,this.hightlight ? this.hightlight : '');
+    }
+  }
 }
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.html b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.html
new file mode 100644 (file)
index 0000000..6fb46c2
--- /dev/null
@@ -0,0 +1,5 @@
+<div [attr.data-tests-id]="'error-msg-wrapper'" class="error-msg-wrapper" *ngIf="errorMsgService?.errorMsgObject">
+  <div class="title" [attr.data-tests-id]="'error-msg-title'">{{errorMsgService?.errorMsgObject?.title}}</div>
+  <div class="sub-title" [attr.data-tests-id]="'error-msg-sub-title'">{{errorMsgService?.errorMsgObject?.subtitle}}</div>
+  <div *ngIf="errorMsgService?.errorMsgObject?.description" class="description" [attr.data-tests-id]="'error-msg-description'">{{errorMsgService?.errorMsgObject?.description}}</div>
+</div>
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.scss b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.scss
new file mode 100644 (file)
index 0000000..98c7e84
--- /dev/null
@@ -0,0 +1,22 @@
+.error-msg-wrapper{
+  display: block;
+  border-top: 6px solid #CF2A2A;
+  border-bottom: 1px solid #D2D2D2;
+  padding: 20px 45px;
+  font-family: OpenSans-Regular;
+  font-size: 14px;
+  .title{
+    color: #CF2A2A;
+    margin-bottom: 10px;
+    font-family: OpenSans-SemiBold;
+    font-size: 16px;
+  }
+  .sub-title{
+    color: #CF2A2A;
+    margin-bottom: 5px;
+  }
+  .description{
+    color: #191919;
+  }
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.spec.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.spec.ts
new file mode 100644 (file)
index 0000000..2ca72c5
--- /dev/null
@@ -0,0 +1,48 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import { ErrorMsgComponent } from './error-msg.component';
+import {ErrorMsgService} from "./error-msg.service";
+import {ErrorMsgObject} from "./error-msg.model";
+
+describe('ErrorMsgComponent', () => {
+
+  let component: ErrorMsgComponent;
+  let fixture: ComponentFixture<ErrorMsgComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ErrorMsgComponent],
+      providers: [ErrorMsgService]
+    }).compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(ErrorMsgComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  test('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  test('should triggerShowError fill error msg object', () => {
+    let errorMsgObj:ErrorMsgObject = new ErrorMsgObject("Title", "SubTitle", "Description")
+    component.errorMsgService.triggerShowError.next(errorMsgObj);
+    let errorMsg = component.errorMsgService.errorMsgObject;
+    expect(errorMsg).toBeDefined();
+    expect(errorMsg.title).toBe('Title');
+    expect(errorMsg.subtitle).toBe('SubTitle');
+    expect(errorMsg.description).toBe('Description');
+  });
+
+  test('should triggerClearError delete error msg object', () => {
+    let errorMsgObj:ErrorMsgObject = new ErrorMsgObject("Title", "SubTitle", "Description")
+    component.errorMsgService.triggerShowError.next(errorMsgObj);
+    let errorMsg = component.errorMsgService.errorMsgObject;
+    expect(errorMsg).toBeDefined();
+    component.errorMsgService.triggerClearError.next();
+    expect(component.errorMsgService.errorMsgObject).toBeNull();
+
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.component.ts
new file mode 100644 (file)
index 0000000..e47a06c
--- /dev/null
@@ -0,0 +1,28 @@
+import {Component, OnChanges, SimpleChanges} from '@angular/core';
+import {ErrorMsgService} from "./error-msg.service";
+import {ErrorMsgObject} from "./error-msg.model";
+
+@Component({
+  selector: 'error-msg',
+  templateUrl: './error-msg.component.html',
+  styleUrls: ['./error-msg.component.scss']
+})
+
+export class ErrorMsgComponent implements OnChanges {
+
+  errorMsgService: ErrorMsgService;
+  constructor(private _errorMsgService: ErrorMsgService) {
+    this.errorMsgService = _errorMsgService;
+    this._errorMsgService.triggerShowError.subscribe((error: ErrorMsgObject) => {
+      this.errorMsgService.errorMsgObject = error;
+    });
+
+    this._errorMsgService.triggerClearError.subscribe(() => {
+      this.errorMsgService.errorMsgObject = null;
+    });
+  }
+
+  ngOnChanges(changes: SimpleChanges): void {
+  }
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.model.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.model.ts
new file mode 100644 (file)
index 0000000..0cdb742
--- /dev/null
@@ -0,0 +1,11 @@
+export class ErrorMsgObject {
+  title: string;
+  subtitle: string;
+  description: string;
+
+  constructor(title: string, subtitle: string, description: string) {
+    this.title = title;
+    this.subtitle = subtitle;
+    this.description = description;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.spec.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.spec.ts
new file mode 100644 (file)
index 0000000..faaef8d
--- /dev/null
@@ -0,0 +1,38 @@
+import {TestBed, getTestBed } from '@angular/core/testing';
+import {ErrorMsgService} from "./error-msg.service";
+
+describe('Error msg Service', () => {
+  let injector;
+  let service: ErrorMsgService;
+
+  beforeAll(done => (async () => {
+
+    TestBed.configureTestingModule(
+      {
+        providers: [
+          ErrorMsgService
+        ]
+      });
+    await TestBed.compileComponents();
+    injector = getTestBed();
+    service = injector.get(ErrorMsgService);
+  })().then(done).catch(done.fail));
+
+  test('should return error msg object when call to getScalingErrorObject', () => {
+    let errorMsgObject = service.getScalingErrorObject();
+    expect(errorMsgObject).toBeDefined();
+    expect(errorMsgObject.title).toBe('Error : Too many members');
+    expect(errorMsgObject.subtitle).toBe('One or more VNF groups, marked below, exceeds the maximum allowed number of members to associate');
+    expect(errorMsgObject.description).toBe('Please make sure the total amount of VNF instances is less than that amount.');
+  });
+
+  test('should return error msg object when call to getRetryErrorObject', () => {
+    let errorMsgObject = service.getRetryErrorObject(1);
+    expect(errorMsgObject).toBeDefined();
+    expect(errorMsgObject.title).toBe('ERROR!');
+    expect(errorMsgObject.subtitle).toBe(`Attention: You are currently viewing instances from the MSO. \n 1 of the instances failed, please try again.`);
+    expect(errorMsgObject.description).toBe(null);
+  });
+
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.ts b/vid-webpack-master/src/app/shared/components/error-msg/error-msg.service.ts
new file mode 100644 (file)
index 0000000..e1bcd42
--- /dev/null
@@ -0,0 +1,22 @@
+import {Injectable} from '@angular/core';
+import {Subject} from 'rxjs/Subject';
+import {ErrorMsgObject} from "./error-msg.model";
+
+@Injectable()
+export class ErrorMsgService {
+  triggerShowError: Subject<ErrorMsgObject> = new Subject<ErrorMsgObject>();
+  triggerClearError: Subject<boolean> = new Subject<boolean>();
+  errorMsgObject: ErrorMsgObject = null;
+
+  getScalingErrorObject(): ErrorMsgObject {
+    return new ErrorMsgObject("Error : Too many members",
+      "One or more VNF groups, marked below, exceeds the maximum allowed number of members to associate",
+      "Please make sure the total amount of VNF instances is less than that amount.");
+  }
+
+  getRetryErrorObject(numberOfFailed: number): ErrorMsgObject {
+    return new ErrorMsgObject("ERROR!",
+      `Attention: You are currently viewing instances from the MSO. \n ${numberOfFailed} of the instances failed, please try again.`,
+      null);
+  }
+}
index 35b83f0..c573d16 100644 (file)
@@ -1,18 +1,16 @@
 import {Injectable} from "@angular/core";
-import {Subject} from "rxjs/Subject";
-import { MessageBoxService } from '../messageBox/messageBox.service';
-import { MessageBoxData, ModalSize, ModalType } from '../messageBox/messageBox.data';
-
+import {MessageBoxService } from '../messageBox/messageBox.service';
+import {MessageBoxData} from '../messageBox/messageBox.data';
+import { SdcUiCommon} from "onap-ui-angular";
 @Injectable()
 export class ErrorService {
   static showErrorWithMessage(error : ErrorMessage) : void {
     setTimeout(()=>{
         let messageBoxData : MessageBoxData = new MessageBoxData(
-          error.title,  // modal title
+          error.title,
           error.text,
-
-          ModalType.error,
-          ModalSize.medium,
+          SdcUiCommon.ModalType.error,
+          SdcUiCommon.ModalSize.medium,
           [
             {text:"Close", size:"large", closeModal:true}
           ]);
@@ -33,3 +31,4 @@ export class ErrorMessage {
     this.errorNumber = errorNumber;
   }
 }
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.html
new file mode 100644 (file)
index 0000000..26362eb
--- /dev/null
@@ -0,0 +1,11 @@
+<div class="details-item">
+  <input type="checkbox"
+         id="{{data?.dataTestId}}"
+         [attr.data-tests-id]="data?.dataTestId"
+         [checked]="data?.value"
+         name="{{data?.controlName}}"
+         [formControl]="form?.controls[data?.controlName]"
+         data-toggle="toggle">
+  <label class="checkbox-label"
+         for="{{data?.dataTestId}}">{{data?.displayName}}</label>
+</div>
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/checkbox/checkbox.formControl.component.ts
new file mode 100644 (file)
index 0000000..f9ba483
--- /dev/null
@@ -0,0 +1,13 @@
+import {Component, Input} from "@angular/core";
+import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
+import {FormGroup} from "@angular/forms";
+
+@Component({
+  selector: 'checkbox-form-control',
+  templateUrl: './checkbox.formControl.component.html'
+})
+export class CheckboxFormControlComponent{
+  @Input() data: FormControlModel;
+  @Input() form: FormGroup;
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.html
new file mode 100644 (file)
index 0000000..6d13e52
--- /dev/null
@@ -0,0 +1,21 @@
+<div class="details-item" *ngIf="data != null && form != null">
+  <label [ngClass]="{'required': data.isRequired()}"
+         for="{{data?.dataTestId}}-select">{{data?.displayName}}:</label>
+  <select class="form-control input-text"
+          id="{{data?.dataTestId}}-select"
+          [attr.data-tests-id]="data?.dataTestId"
+          name="{{data?.name}}"
+          [formControl]="form.controls[data.controlName]"
+          [ngClass]="{'error-style' : (form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors) || data?.hasEmptyOptions ,
+                      'grayColor': form?.controls[data?.controlName]?.value == null || form?.controls[data?.controlName]?.value == undefined,
+                      'blackColor' : form?.controls[data?.controlName]?.value != null}"
+          (blur)="data.onBlur()">
+
+    <option [value]="null" hidden>{{data?.placeHolder}}</option>
+    <option *ngFor="let option of data?.options$ | orderBy : {property : 'name', direction : 1} ; let i = index" class="{{option?.id}} {{data?.dataTestId}}Option"
+            [value]="option[data.ngValue]" [disabled]="!option?.isPermitted && option?.isPermitted != undefined">{{option.name}}
+    </option>
+  </select>
+  <form-control-error *ngIf="data?.hasEmptyOptions" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+</div>
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.scss b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.scss
new file mode 100644 (file)
index 0000000..9826332
--- /dev/null
@@ -0,0 +1,7 @@
+.grayColor {
+  color: gray !important;
+}
+
+.blackColor {
+  color: black !important;
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/dropdown/dropdown.formControl.component.ts
new file mode 100644 (file)
index 0000000..550feca
--- /dev/null
@@ -0,0 +1,27 @@
+import {Component, Input, OnChanges, SimpleChanges} from "@angular/core";
+import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model";
+import {FormGroup} from "@angular/forms";
+
+@Component({
+  selector: 'dropdown-form-control',
+  templateUrl: './dropdown.formControl.component.html',
+  styleUrls : ['./dropdown.formControl.component.scss']
+})
+export class DropdownFormControlComponent implements OnChanges{
+  @Input() data: DropdownFormControl = null;
+  @Input() form: FormGroup = null;
+
+  ngOnChanges(changes: SimpleChanges): void {
+    if (changes["data"] !== undefined && changes["data"].currentValue !== changes["data"].previousValue && changes["data"].firstChange) {
+      if(this.data.onInit){
+        this.data.onInit(this.data, this.form);
+      }
+    }
+
+    if (changes["data"] !== undefined) {
+      this.form.controls[this.data.controlName].valueChanges.subscribe((value)=>{
+        this.data.onChange(value, this.form);
+      })
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.html
new file mode 100644 (file)
index 0000000..bcbe91e
--- /dev/null
@@ -0,0 +1,22 @@
+<div class="details-item file-form-control">
+  <label [ngClass]="{'required': data.isRequired()}" for="{{data?.controlName}}">{{data?.displayName}}:</label>
+  <label for="{{data?.controlName}}" class="file-input-wrapper" [ngClass]="{'file-uploaded': fileUploader.files && fileUploader.files[0] || data.selectedFile != data.placeHolder}">
+    <span data-tests-id="file-name" class="file-name">
+      {{ fileUploader.files && fileUploader.files[0] ? fileUploader.files[0].name : data.selectedFile}}
+    </span>
+     <input id="{{data?.controlName}}"
+           name="{{data?.controlName}}"
+           class="form-control input-text"
+           [formControl]="form?.controls[data?.controlName]"
+           [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}"
+           type="file"
+           #fileUploader
+           accept="{{data?.acceptedExtentions}}"
+           (change)="data?.onChange($event.target.files, form)">
+    <input *ngFor="let hiddenFile of data?.hiddenFile" type="hidden" id="{{hiddenFile.controlName}}" name="{{hiddenFile.controlName}}"
+           [formControl]="form?.controls[hiddenFile.controlName]"/>
+    <span class="delete" data-tests-id="remove-uploaded-file" (click)="onDelete($event, data, form)">X</span>
+    <span class="icon-browse"></span>
+  </label>
+</div>
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.scss b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.scss
new file mode 100644 (file)
index 0000000..98fae02
--- /dev/null
@@ -0,0 +1,87 @@
+.file-form-control{
+  label{
+    color: #191919;
+  }
+  input[type=file] {
+    opacity: 0;
+    flex: 0;
+  }
+  .file-input-wrapper{
+    display: flex;
+    background: #FFFFFF;
+    border: 1px solid #D2D2D2;
+    border-radius: 2px;
+    height: 38px;
+    &:hover{
+      cursor: pointer;
+      border: 1px solid #009FDB;
+        .icon-browse{
+          background: #E6F6FB;
+          border-left: 1px solid #009FDB;
+          &:before{
+            color: #009FDB;
+          }
+      }
+    }
+    &:active{
+      .icon-browse{
+        background: #1EB9F3;
+        border-left: 1px solid #009FDB;
+        &:before{
+          color: #ffffff;
+        }
+      }
+    }
+    .file-name {
+      font-family: OpenSans-Italic;
+      font-weight: normal;
+      font-size: 14px;
+      color: #959595;
+      margin: 9px;
+      width: 100%;
+    }
+    .icon-browse{
+      z-index: 1;
+      margin-left: auto;
+      margin-bottom: 0;
+      cursor: pointer;
+      content: "\e90d";
+      color: #5A5A5A;
+      font-size: 30px;
+      display: block;
+      text-align: center;
+      padding-top: 4px;
+      background: #F2F2F2;
+      border-left: 1px solid #D2D2D2;
+      width: 36px;
+      height:100%;
+      &:before{
+        content: "\e90d";
+        color: #5A5A5A;
+      }
+    }
+    .delete{
+      visibility: hidden;
+      cursor: pointer;
+      font-size: 14px;
+      margin-right: 10px;
+      margin-top: 9px;
+      color: #5a5a5a;
+      margin-left: 10px;
+      z-index: 1;
+      &:hover{
+        color: #000000;
+      }
+    }
+    &.file-uploaded{
+      .file-name{
+        font-family: OpenSans-Regular;
+        font-size: 14px;
+        color: #000000;
+      }
+      .delete{
+        visibility: visible;
+      }
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.spec.ts b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.spec.ts
new file mode 100644 (file)
index 0000000..e27f511
--- /dev/null
@@ -0,0 +1,62 @@
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'
+import {FileFormControlComponent} from "./file.formControl.component";
+import {CommonModule} from "@angular/common";
+import {FormBuilder, FormControl, ReactiveFormsModule, Validators} from "@angular/forms";
+import {ValidatorModel, ValidatorOptions} from "../../../../models/formControlModels/formControl.model";
+import {FormControlMessageErrorComponent} from "../../errorMessage/formControlMessageError.component";
+import {BrowserModule} from "@angular/platform-browser";
+import {TooltipModule} from "ngx-tooltip";
+import {FileFormControl} from "../../../../models/formControlModels/fileFormControl.model";
+
+describe('File Form Control Component', () => {
+  let component: FileFormControlComponent;
+  let fixture: ComponentFixture<FileFormControlComponent>;
+  let fb: FormBuilder;
+
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [CommonModule, BrowserModule, ReactiveFormsModule, TooltipModule],
+      providers: [FormBuilder],
+      declarations: [FileFormControlComponent, FormControlMessageErrorComponent],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA]
+    });
+    await TestBed.compileComponents();
+
+    fixture = TestBed.createComponent(FileFormControlComponent);
+    component = fixture.componentInstance;
+    fb = TestBed.get(FormBuilder);
+
+  })().then(done).catch(done.fail));
+
+  test('file component should initialize basic parameters', () => {
+    component.data = new FileFormControl({
+      displayName: "display Name",
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      dataTestId: "data-test-id",
+      placeHolder: "place holder",
+      controlName: 'testFile',
+      acceptedExtentions: "json"
+    });
+
+    component.form = fb.group({
+      'testFile': new FormControl({
+          value: component.data.selectedFile,
+          disabled: false
+        },
+        Validators.compose(component.data.validations.map(item => item.validator))
+      ),
+    });
+
+    component.data.onDelete = function () {
+      component.form.controls['testFile'].setValue('onDelete');
+    };
+
+    expect(component.form.controls['testFile'].value).toEqual("place holder");
+    let event = new Event("onDelete", null);
+    component.data.onDelete(event, component.data, component.form);
+    expect(component.form.controls['testFile'].value).toEqual('onDelete');
+  })
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/file/file.formControl.component.ts
new file mode 100644 (file)
index 0000000..2c21720
--- /dev/null
@@ -0,0 +1,27 @@
+import {Component, ElementRef, Input, ViewChild} from "@angular/core";
+import {FormGroup} from "@angular/forms";
+import {FileFormControl} from "../../../../models/formControlModels/fileFormControl.model";
+
+@Component({
+  selector : 'file-form-control',
+  templateUrl : './file.formControl.component.html',
+  styleUrls : ['./file.formControl.component.scss']
+})
+
+export class FileFormControlComponent {
+  @Input() data: FileFormControl = null;
+  @Input() form: FormGroup;
+  @ViewChild('fileUploader')
+  fileUploader:ElementRef ;
+
+  onDelete(event, data, form) {
+    event.stopPropagation();
+    event.preventDefault();
+    form.value[data.controlName] = this.fileUploader.nativeElement.value = "";
+    data.selectedFile = data.placeHolder;
+    if (data.onDelete){
+      data.onDelete(form);
+    }
+
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/file/fileUnit.enum.ts b/vid-webpack-master/src/app/shared/components/formControls/component/file/fileUnit.enum.ts
new file mode 100644 (file)
index 0000000..d875e48
--- /dev/null
@@ -0,0 +1,7 @@
+export enum FileUnit {
+  b,
+  B,
+  KB,
+  MB,
+  GB
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.html
new file mode 100644 (file)
index 0000000..90ac7c6
--- /dev/null
@@ -0,0 +1,25 @@
+<div class="details-item" *ngIf="data?.isVisible">
+  <label
+    [tooltip]="data?.tooltip ? data.tooltip : null"
+    id="{{data?.dataTestId}}-label"
+    [ngClass]="{'required' : data?.isRequired()}">
+    {{data?.displayName}}: </label>
+  <input
+    #customInput
+
+    [disabled]="data?.isDisabled ? data.isDisabled : false"
+    [type]="data?.inputType ? data?.inputType : 'text'"
+    [attr.data-tests-id]="data?.dataTestId"
+    class="form-control input-text"
+    id="{{data?.dataTestId}}"
+    [placeholder]="data?.placeHolder ? data?.placeHolder : ''"
+    [formControl]="form?.controls[data?.controlName]"
+    [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}"
+    minlength="{{data?.minLength}}"
+    maxlength="{{data?.maxLength}}"
+    (blur)="data.onBlur($event, form)"
+    (keypress)="data?.onKeypress($event)">
+</div>
+
+
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.spec.ts b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.spec.ts
new file mode 100644 (file)
index 0000000..84d379d
--- /dev/null
@@ -0,0 +1,68 @@
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'
+import {InputFormControlComponent} from "./input.formControl.component";
+import {CommonModule} from "@angular/common";
+import {FormBuilder, FormControl, ReactiveFormsModule, Validators} from "@angular/forms";
+import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
+import {ValidatorModel, ValidatorOptions} from "../../../../models/formControlModels/formControl.model";
+import {FormControlMessageErrorComponent} from "../../errorMessage/formControlMessageError.component";
+import {BrowserModule} from "@angular/platform-browser";
+import {TooltipModule} from "ngx-tooltip";
+
+describe('Input Form Control Component', () => {
+  let component: InputFormControlComponent;
+  let fixture: ComponentFixture<InputFormControlComponent>;
+  let fb: FormBuilder;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [CommonModule, BrowserModule, ReactiveFormsModule, TooltipModule],
+      providers: [FormBuilder],
+      declarations: [InputFormControlComponent, FormControlMessageErrorComponent],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA]
+    });
+    await TestBed.compileComponents();
+
+    fixture = TestBed.createComponent(InputFormControlComponent);
+    component = fixture.componentInstance;
+    fb = TestBed.get(FormBuilder);
+
+  })().then(done).catch(done.fail));
+
+  test('component should initialize basic parameters', () => {
+      component.data = new InputFormControl({
+        value: "value",
+        displayName: "display Name",
+        validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+        dataTestId: "data-test-id",
+        placeHolder: "place holder",
+        controlName: 'testInstanceName'
+      });
+
+      component.data.hasErrors = function () {
+        return this.formGroup.controls[this.controlName].touched && this.formGroup.controls[this.controlName].errors ? ['error-style'] : [];
+      };
+
+      component.data.onBlur = function () {
+        component.form.controls['testInstanceName'].setValue('onBlur');
+      };
+
+      component.form = fb.group({
+        'testInstanceName': new FormControl({
+          value: component.data.value,
+          disabled: false
+        }, Validators.compose(component.data.validations.map(item => item.validator)))
+      });
+
+
+      component.form.controls['testInstanceName'].setValue('newValue');
+      expect(component.form.controls['testInstanceName'].errors).toBeFalsy();
+      component.form.controls['testInstanceName'].setValue('');
+      expect(component.form.controls['testInstanceName'].errors.required).toBeTruthy();
+      component.data.onBlur();
+      expect(component.form.controls['testInstanceName'].value).toEqual('onBlur');
+      expect(component.form.controls['testInstanceName'].errors).toBeFalsy();
+    }
+  )
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/input/input.formControl.component.ts
new file mode 100644 (file)
index 0000000..1e8c281
--- /dev/null
@@ -0,0 +1,18 @@
+import {Component, ElementRef, Input, ViewChild} from "@angular/core";
+import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
+import {FormGroup} from "@angular/forms";
+
+@Component({
+  selector : 'form-control-input',
+  templateUrl : './input.formControl.component.html',
+  styleUrls : ['./input.formControl.component.scss']
+})
+
+export class InputFormControlComponent{
+  @ViewChild('customInput') element:ElementRef;
+  @Input() data: InputFormControl = null;
+  @Input() form: FormGroup;
+
+
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.html
new file mode 100644 (file)
index 0000000..f7c4894
--- /dev/null
@@ -0,0 +1,16 @@
+<div>
+  <div class="details-item" *ngIf="data != null && form != null">
+    <label [ngClass]="{'required': data.isRequired()}"
+           for="{{data?.dataTestId}}">{{data?.displayName}}:</label>
+    <angular2-multiselect id="{{data?.dataTestId}}"
+                          [attr.data-tests-id]="data?.dataTestId"
+                          [formControl]="form.controls[data.controlName]"
+                          [(ngModel)]="data.selectedItems"
+                          [data]="data?.options$"
+                          [settings]="data?.settings"
+                          title="{{data.tooltip}}"
+                          [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}">
+    </angular2-multiselect>
+  </div>
+</div>
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.spec.ts b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.spec.ts
new file mode 100644 (file)
index 0000000..81c8d46
--- /dev/null
@@ -0,0 +1,74 @@
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'
+import {CommonModule} from "@angular/common";
+import {FormBuilder, FormControl, ReactiveFormsModule, Validators} from "@angular/forms";
+import {
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {FormControlMessageErrorComponent} from "../../errorMessage/formControlMessageError.component";
+import {BrowserModule} from "@angular/platform-browser";
+import {MultiselectFormControlComponent} from "./multiselect.formControl.component";
+import {MultiselectFormControl} from "../../../../models/formControlModels/multiselectFormControl.model";
+import { of } from "rxjs";
+describe('Dropdown Form Control Component', () => {
+  let component: MultiselectFormControlComponent;
+  let fixture: ComponentFixture<MultiselectFormControlComponent>;
+  let fb: FormBuilder;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [CommonModule, BrowserModule, ReactiveFormsModule],
+      providers: [FormBuilder],
+      declarations: [MultiselectFormControlComponent, FormControlMessageErrorComponent],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA]
+    });
+    await TestBed.compileComponents();
+
+    fixture = TestBed.createComponent(MultiselectFormControlComponent);
+    component = fixture.componentInstance;
+    fb = TestBed.get(FormBuilder);
+
+  })().then(done).catch(done.fail));
+
+  test('component should initialize basic parameters', () => {
+      component.data = new MultiselectFormControl({
+        displayName: "display Name",
+        validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+        dataTestId: "data-test-id",
+        placeHolder: "place holder",
+        controlName: 'testDropdown',
+        options: of([
+          'option1',
+          'option2',
+          'option3',
+          'onBlur'
+        ])
+      });
+
+      component.data.hasErrors = function () {
+        return this.formGroup.controls[this.controlName].touched && this.formGroup.controls[this.controlName].errors ? ['error-style'] : [];
+      };
+
+      component.data.onBlur = function () {
+        component.form.controls['testDropdown'].setValue('onBlur');
+      };
+
+      component.form = fb.group({
+        'testDropdown': new FormControl({
+          value: component.data.value,
+          disabled: false
+        }, Validators.compose(component.data.validations.map(item => item.validator)))
+      });
+
+      component.form.controls['testDropdown'].setValue('');
+      expect(component.form.controls['testDropdown'].errors.required).toBeTruthy();
+      component.form.controls['testDropdown'].setValue('option2');
+      expect(component.form.controls['testDropdown'].errors).toBeFalsy();
+      component.data.onBlur();
+      expect(component.form.controls['testDropdown'].value).toEqual('onBlur');
+      expect(component.form.controls['testDropdown'].errors).toBeFalsy();
+    }
+  )
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/multiselect/multiselect.formControl.component.ts
new file mode 100644 (file)
index 0000000..4b98c7e
--- /dev/null
@@ -0,0 +1,20 @@
+import {Component, Input, OnChanges, SimpleChanges} from "@angular/core";
+import {FormGroup} from "@angular/forms";
+import {MultiselectFormControl} from "../../../../models/formControlModels/multiselectFormControl.model";
+
+@Component({
+  selector: 'multiselect-form-control',
+  templateUrl: './multiselect.formControl.component.html'
+})
+export class MultiselectFormControlComponent implements OnChanges{
+  @Input() data: MultiselectFormControl = null;
+  @Input() form: FormGroup = null;
+
+  ngOnChanges(changes: SimpleChanges): void {
+    if (changes["data"] !== undefined && changes["data"].currentValue !== changes["data"].previousValue && changes["data"].firstChange) {
+      if(this.data.onInit){
+        this.data.onInit(this.data, this.form);
+      }
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.html b/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.html
new file mode 100644 (file)
index 0000000..3763764
--- /dev/null
@@ -0,0 +1,13 @@
+<div>
+  <div class="details-item" *ngIf="data != null && form != null">
+    <label [ngClass]="{'required': data.isRequired()}"
+           for="{{data?.dataTestId}}">{{data?.displayName}}:</label>
+    <input id="{{data?.dataTestId}}" [attr.data-tests-id]="data?.dataTestId"
+           name="{{data?.controlName}}" class="form-control input-text"
+           [formControl]="form.controls[data.controlName]" type="number"
+           placeholder="{{data?.placeHolder}}" title="{{data?.tooltip}}"
+           [ngClass]="{'error-style' : form?.controls[data?.controlName]?.touched && form?.controls[data?.controlName]?.errors}"
+           min="{{data?.min}}" max="{{data?.max}}">
+  </div>
+</div>
+
diff --git a/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.ts b/vid-webpack-master/src/app/shared/components/formControls/component/number/number.formControl.component.ts
new file mode 100644 (file)
index 0000000..bd25ded
--- /dev/null
@@ -0,0 +1,12 @@
+import {Component, Input} from "@angular/core";
+import {FormGroup} from "@angular/forms";
+import {NumberFormControl} from "../../../../models/formControlModels/numberFormControl.model";
+
+@Component({
+  selector: 'number-form-control',
+  templateUrl: './number.formControl.component.html'
+})
+export class NumberFormControlComponent {
+  @Input() data: NumberFormControl = null;
+  @Input() form: FormGroup = null;
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.html b/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.html
new file mode 100644 (file)
index 0000000..4d89854
--- /dev/null
@@ -0,0 +1,5 @@
+<div  *ngIf="form != null && formControl != null && form.controls[formControl.controlName]?.errors">
+  <div *ngFor="let validatorModel of formControl?.validations">
+    <form-control-error *ngIf="form.controls[formControl?.controlName]?.errors[validatorModel?.validatorName]" [message]="validatorModel?.errorMsg"></form-control-error>
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.ts b/vid-webpack-master/src/app/shared/components/formControls/errorMessage/formControlMessageError.component.ts
new file mode 100644 (file)
index 0000000..02ec57e
--- /dev/null
@@ -0,0 +1,15 @@
+import {Component, Input, OnChanges, SimpleChanges} from "@angular/core";
+import {FormGroup} from "@angular/forms";
+import {FormControlModel} from "../../../models/formControlModels/formControl.model";
+
+@Component({
+  selector : 'form-control-message-error',
+  templateUrl : './formControlMessageError.component.html'
+})
+export class FormControlMessageErrorComponent implements OnChanges{
+  @Input() formControl: FormControlModel = null;
+  @Input() form: FormGroup = null;
+
+  ngOnChanges(changes: SimpleChanges): void {
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.service.ts b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.service.ts
new file mode 100644 (file)
index 0000000..1550e08
--- /dev/null
@@ -0,0 +1,7 @@
+import {Injectable} from "@angular/core";
+import {Subject} from "rxjs";
+
+@Injectable()
+export class FormGeneralErrorsService {
+  static checkForErrorTrigger : Subject<boolean> = new Subject<boolean>();
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.spec.ts
new file mode 100644 (file)
index 0000000..4189fba
--- /dev/null
@@ -0,0 +1,48 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {AaiService} from "../../../services/aaiService/aai.service";
+import {FormControlModel, ValidatorModel, ValidatorOptions} from "../../../models/formControlModels/formControl.model";
+import {FeatureFlagsService} from "../../../services/featureFlag/feature-flags.service";
+import {BasicControlGenerator} from "./basic.control.generator";
+import {NgRedux} from '@angular-redux/store';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+
+class MockAppStore<T> {}
+
+class MockFeatureFlagsService {}
+
+describe('Basic Control Generator', () => {
+  let injector;
+  let service: BasicControlGenerator;
+  let httpMock: HttpTestingController;
+
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [BasicControlGenerator,
+        AaiService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(BasicControlGenerator);
+    httpMock = injector.get(HttpTestingController);
+
+  })().then(done).catch(done.fail));
+
+
+  test('getlegacyRegion with JANET25 - isVisible true', () => {
+    const instance = {lcpCloudRegionId : 'JANET25'};
+    const legacyRegionControl: FormControlModel = service.getLegacyRegion(instance);
+    expect(legacyRegionControl.isVisible).toBeTruthy();
+  });
+
+  test('getlegacyRegion without JANET25 - isVisible false', () => {
+    const instance = {lcpCloudRegionId : 'olson3'};
+    const legacyRegionControl: FormControlModel = service.getLegacyRegion(instance);
+    expect(legacyRegionControl.isVisible).toBeFalsy();
+  });
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/basic.control.generator.ts
new file mode 100644 (file)
index 0000000..cbbff3c
--- /dev/null
@@ -0,0 +1,240 @@
+import {Injectable} from "@angular/core";
+import {DropdownFormControl} from "../../../models/formControlModels/dropdownFormControl.model";
+import {FormGroup} from "@angular/forms";
+import {
+  CustomValidatorOptions,
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../models/formControlModels/formControl.model";
+import {InputFormControl} from "../../../models/formControlModels/inputFormControl.model";
+import {AppState} from "../../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {NumberFormControl} from "../../../models/formControlModels/numberFormControl.model";
+import {FormControlType} from "../../../models/formControlModels/formControlTypes.enum";
+import {FileFormControl} from "../../../models/formControlModels/fileFormControl.model";
+import {SelectOption} from "../../../models/selectOption";
+import * as _ from 'lodash';
+import {DynamicInputLabelPipe} from "../../../pipes/dynamicInputLabel/dynamic-input-label.pipe";
+import {AaiService} from "../../../services/aaiService/aai.service";
+import {FormGeneralErrorsService} from "../../formGeneralErrors/formGeneralErrors.service";
+import {Observable, of} from "rxjs";
+import {NodeModel} from "../../../models/nodeModel";
+import {Constants} from "../../../utils/constants";
+
+
+@Injectable()
+export class BasicControlGenerator {
+
+  public static readonly INSTANCE_NAME_REG_EX:RegExp = /^[a-zA-Z0-9._-]*$/;
+  public static readonly GENERATED_NAME_REG_EX:RegExp = /[^a-zA-Z0-9._-]/g;
+
+  constructor(private _store : NgRedux<AppState>,
+              private _aaiService : AaiService){}
+  getSubscribeResult(subscribeFunction : Function, control : DropdownFormControl) : Observable<any>{
+    return subscribeFunction(this).subscribe((res) => {
+      control.options$ = res;
+      control.hasEmptyOptions = res.length === 0;
+      FormGeneralErrorsService.checkForErrorTrigger.next();
+      return of(res);
+    });
+  }
+
+  getSubscribeInitResult(subscribeFunction : Function, control : DropdownFormControl, form : FormGroup) : Observable<any>{
+    return subscribeFunction(this).subscribe((res) => {
+      if(!_.isNil(control['onInitSelectedField'])){
+        let result = res;
+        for(let key of control['onInitSelectedField']){
+          result = !_.isNil(result[key]) ? result[key] : [];
+        }
+        control.options$ = result;
+        control.hasEmptyOptions = _.isNil(result) || result.length === 0;
+      } else{
+        control.options$ = !_.isNil(res) ? res : [];
+        control.hasEmptyOptions = _.isNil(res) || res.length === 0;
+      }
+
+      FormGeneralErrorsService.checkForErrorTrigger.next();
+      return of(res);
+    });
+  }
+
+  getInstanceNameController(instance: any, serviceId: string, isEcompGeneratedNaming: boolean, model: NodeModel): FormControlModel {
+    let validations: ValidatorModel[] = this.createValidationsForInstanceName(instance, serviceId, isEcompGeneratedNaming);
+    return new InputFormControl({
+      controlName: 'instanceName',
+      displayName: 'Instance name',
+      dataTestId: 'instanceName',
+      placeHolder: (!isEcompGeneratedNaming) ? 'Instance name' : 'Automatically generated when not provided',
+      validations: validations,
+      isVisible : true,
+      value : (!isEcompGeneratedNaming || (!_.isNil(instance) && !_.isNil(instance.instanceName)))
+        ? this.getDefaultInstanceName(instance, model) : null,
+      onKeypress : (event) => {
+        const pattern:RegExp = BasicControlGenerator.INSTANCE_NAME_REG_EX;
+        if(pattern){
+          if(!pattern.test(event['key'])){
+            event.preventDefault();
+          }
+        }
+        return event;
+      }
+    });
+  }
+
+  getInstanceName(instance : any, serviceId : string, isEcompGeneratedNaming: boolean): FormControlModel {
+    let formControlModel:FormControlModel = this.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, new NodeModel());
+    formControlModel.value = instance ? instance.instanceName : null;
+    return formControlModel;
+  }
+
+  isLegacyRegionShouldBeVisible(instance : any) : boolean {
+    if(!_.isNil(instance) && !_.isNil(instance.lcpCloudRegionId))  {
+      return Constants.LegacyRegion.MEGA_REGION.indexOf(instance.lcpCloudRegionId) !== -1;
+    }
+    return false;
+  }
+
+  getLegacyRegion(instance: any): FormControlModel {
+    return new InputFormControl({
+      controlName: 'legacyRegion',
+      displayName: 'Legacy Region',
+      dataTestId: 'lcpRegionText',
+      placeHolder: 'Type Legacy Region',
+      validations: [],
+      isVisible: this.isLegacyRegionShouldBeVisible(instance),
+      isDisabled : _.isNil(instance) ? true : Constants.LegacyRegion.MEGA_REGION.indexOf(instance.lcpCloudRegionId),
+      value: instance ? instance.legacyRegion : null
+    });
+  }
+
+  private createValidationsForInstanceName(instance: any, serviceId: string, isEcompGeneratedNaming: boolean): ValidatorModel[] {
+    let validations: ValidatorModel[] = [
+      new ValidatorModel(ValidatorOptions.pattern, 'Instance name may include only alphanumeric characters and underscore.', BasicControlGenerator.INSTANCE_NAME_REG_EX),
+      new ValidatorModel(CustomValidatorOptions.uniqueInstanceNameValidator, 'some error', [this._store, serviceId, instance && instance.instanceName])
+    ];
+    if (!isEcompGeneratedNaming) {
+      validations.push(new ValidatorModel(ValidatorOptions.required, 'is required'));
+    }
+    return validations;
+  }
+
+  getInputsOptions = (options: any[]) : Observable<SelectOption[]> =>{
+    let optionList: SelectOption[] = [];
+    options.forEach((option) => {
+      optionList.push(new SelectOption({
+        id: option.id || option.name,
+        name: option.name
+      }));
+    });
+    return of(optionList);
+  };
+
+  getProductFamilyControl = (instance : any, controls : FormControlModel[], isMandatory?: boolean) : DropdownFormControl => {
+    return new DropdownFormControl({
+      type : FormControlType.DROPDOWN,
+      controlName : 'productFamilyId',
+      displayName : 'Product family',
+      dataTestId : 'productFamily',
+      placeHolder : 'Select Product Family',
+      isDisabled : false,
+      name : "product-family-select",
+      value : instance ? instance.productFamilyId : null,
+      validations : _.isNil(isMandatory) || isMandatory === true ? [new ValidatorModel(ValidatorOptions.required, 'is required')]: [],
+      onInit : this.getSubscribeResult.bind(this, this._aaiService.getProductFamilies),
+    })
+  };
+
+
+
+  getDynamicInputsByType(dynamicInputs : any, serviceModelId : string, storeKey : string, type: string ) : FormControlModel[] {
+    let result : FormControlModel[] = [];
+    if(dynamicInputs) {
+      let nodeInstance = null;
+      if (_.has(this._store.getState().service.serviceInstance[serviceModelId][type], storeKey)) {
+        nodeInstance = Object.assign({}, this._store.getState().service.serviceInstance[serviceModelId][type][storeKey]);
+      }
+      result = this.getDynamicInputs(dynamicInputs, nodeInstance);
+    }
+    return result;
+  }
+
+
+  getServiceDynamicInputs(dynamicInputs : any, serviceModelId : string) : FormControlModel[] {
+    let result: FormControlModel[] = [];
+    if (dynamicInputs) {
+      let serviceInstance = null;
+      if (_.has(this._store.getState().service.serviceInstance, serviceModelId)) {
+        serviceInstance = Object.assign({}, this._store.getState().service.serviceInstance[serviceModelId]);
+      }
+      result = this.getDynamicInputs(dynamicInputs, serviceInstance);
+    }
+    return result;
+  }
+
+  getDynamicInputs(dynamicInputs : any, instance :any)  : FormControlModel[]{
+    let result : FormControlModel[] = [];
+    if(dynamicInputs) {
+      dynamicInputs.forEach((input)=> {
+        let validations: ValidatorModel[] = [];
+        if(input.isRequired) {
+          validations.push(new ValidatorModel(ValidatorOptions.required, 'is required'))
+        }
+        if(input.minLength) {
+          validations.push(new ValidatorModel(ValidatorOptions.minLength, '', input.minLength))
+        }
+        if(input.maxLength) {
+          validations.push(new ValidatorModel(ValidatorOptions.maxLength, '', input.maxLength))
+        }
+
+        let dynamicInputLabelPipe: DynamicInputLabelPipe = new DynamicInputLabelPipe();
+        let data:any = {
+          controlName: input.name,
+          displayName: dynamicInputLabelPipe.transform(input.name).slice(0, -1),
+          dataTestId: input.id,
+          placeHolder: input.prompt,
+          tooltip: input.description,
+          validations: validations,
+          isVisible: input.isVisible,
+          value: !_.isNil(instance) && !_.isNil(instance.instanceParams) && instance.instanceParams.length > 0 ? instance.instanceParams[0][input.name] : input.value
+        };
+
+        switch (input.type) {
+          case 'select' :
+          case 'boolean' :{
+            data.value = data.value || input.optionList.filter((option) => option.isDefault ? option.id || option.name: null);
+            data.onInit  = this.getSubscribeInitResult.bind(null, this.getInputsOptions.bind(this, input.optionList));
+            result.push(new DropdownFormControl(data));
+            break;
+          }
+          case 'checkbox': {
+            data.type = FormControlType.CHECKBOX;
+            result.push(new FormControlModel(data));
+            break;
+          }
+          case 'number': {
+            data.min = input.min;
+            data.max = input.max;
+            result.push(new NumberFormControl(data));
+            break;
+          }
+          case 'file': {
+            result.push(new FileFormControl(data));
+            break;
+          }
+          default: {
+            result.push(new InputFormControl(data));
+          }
+        }
+      })
+    }
+
+    return result;
+  }
+
+  getDefaultInstanceName(instance: any, model: NodeModel) : string {
+    const initialInstanceName = (!_.isNil(instance) && instance.instanceName) || (!_.isNil(model.name) ? model.name.replace(BasicControlGenerator.GENERATED_NAME_REG_EX, "") : model.name);
+    return initialInstanceName;
+  }
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.spec.ts
new file mode 100644 (file)
index 0000000..97c6ddf
--- /dev/null
@@ -0,0 +1,1979 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from '@angular-redux/store';
+import {BasicControlGenerator} from "../basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {GenericFormService} from "../../generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {LogService} from "../../../../utils/log/log.service";
+import {FormControlNames, NetworkControlGenerator} from "./network.control.generator";
+import {
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T> {
+  getState(){
+  return {
+  "global": {
+    "name": null,
+    "flags": {
+      "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+      "FLAG_SHOW_ASSIGNMENTS": true,
+      "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+      "FLAG_UNASSIGN_SERVICE": true,
+      "FLAG_SHOW_VERIFY_SERVICE": false,
+      "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+      "FLAG_DUPLICATE_VNF": true,
+      "FLAG_SERVICE_MODEL_CACHE": true,
+      "CREATE_INSTANCE_TEST": false,
+      "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+      "FLAG_ASYNC_INSTANTIATION": true,
+      "FLAG_ASYNC_JOBS": true,
+      "EMPTY_DRAWING_BOARD_TEST": false,
+      "FLAG_ADD_MSO_TESTAPI_FIELD": true
+    },
+    "type": "[FLAGS] Update"
+  },
+  "service": {
+    "serviceHierarchy": {
+      "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": "Emanuel",
+          "serviceType": "",
+          "serviceRole": "",
+          "description": "ComplexService",
+          "serviceEcompNaming": "false",
+          "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": {
+              "max_instances": 10,
+              "min_instances": 1,
+              "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+              "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:11:22:EF:AC:DF",
+              "sctp-b-ipv6-ingress-src_start_port": "0.0",
+              "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+              "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:11:22:EF:AC:DF",
+              "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+              "Internal2_net_cidr": "10.0.0.10",
+              "sctp-a-ingress-dst_start_port": "0.0",
+              "sctp-a-egress-dst_start_port": "0.0",
+              "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+              "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:11:22:EF:AC:DF",
+              "sctp-a-ipv6-ingress-src_start_port": "0.0",
+              "sctp-b-ipv6-egress_ethertype": "IPv4",
+              "Internal1_net_cidr": "10.0.0.10",
+              "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": "false",
+              "sctp-a-IPv6_ethertype": "IPv6",
+              "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+              "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:11:22:EF:AC:DF",
+              "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:11:22:EF:AC:DF",
+              "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:11:22:EF:AC:DF",
+              "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+              "Internal1_net_cidr_len": "17",
+              "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+              "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:11:22:EF:AC:DF",
+              "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:11:22:EF:AC:DF",
+              "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:11:22:EF:AC:DF",
+              "vlc_st_interface_type_oam": "management",
+              "multi_stage_design": "true",
+              "oam_sec_group_name": "oam-sec-group",
+              "Internal2_net_gateway": "10.0.0.10",
+              "sctp-a-ipv6-ingress-dst_end_port": "65535",
+              "sctp-b-ipv6-egress-dst_start_port": "0",
+              "Internal1_net_gateway": "10.0.0.10",
+              "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:11:22:EF:AC:DF",
+              "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:11:22:EF:AC:DF",
+              "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": true
+              },
+              "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": {
+              "ecomp_generated_naming" : "false",
+              "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"
+          },
+          "ExtVL 1": {
+            "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b987",
+            "invariantUuid": "379f816b-a7aa-422f-be30-17114ff50b7c",
+            "description": "ECOMP generic virtual link (network) base type for all other service-level and global networks",
+            "name": "ExtVL1",
+            "version": "37.0",
+            "customizationUuid": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "ecomp_generated_naming" : "true",
+              "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": true
+          },
+          "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": {}
+      }
+    },
+    "serviceInstance": {
+      "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+        "networks" : {},
+        "vnfs": {
+          "VF_vMee 0": {
+            "rollbackOnFailure": "true",
+            "vfModules": {
+              "vf_vmee0..VfVmee..base_vmme..module-0": {
+                "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+                  "isMissingData": false,
+                  "sdncPreReload": null,
+                  "modelInfo": {
+                    "modelType": "VFmodule",
+                    "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+                    "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+                    "modelName": "VfVmee..base_vmme..module-0",
+                    "modelVersion": "2",
+                    "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                    "modelCustomizationName": "VfVmee..base_vmme..module-0"
+                  },
+                  "instanceParams": [
+                    {}
+                    ],
+                  "trackById": "wmtm6sy2uj"
+                }
+              }
+            },
+            "isMissingData": true,
+            "originalName": "VF_vMee 0",
+            "vnfStoreKey": "VF_vMee 0",
+            "trackById": "p3wk448m5do",
+            "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "lcpCloudRegionId": null,
+            "tenantId": null,
+            "lineOfBusiness": null,
+            "platformName": null,
+            "modelInfo": {
+              "modelType": "VF",
+              "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+              "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "modelName": "VF_vMee",
+              "modelVersion": "2.0",
+              "modelCustomizationName": "VF_vMee 0"
+            }
+          }
+        },
+        "instanceParams": [
+          {}
+          ],
+        "validationCounter": 1,
+        "existingNames": {},
+        "existingVNFCounterMap": {
+          "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+        },
+        "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "subscriptionServiceType": "TYLER SILVIA",
+        "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+        "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+        "lcpCloudRegionId": "hvf6",
+        "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+        "aicZoneId": "JAG1",
+        "projectName": "x1",
+        "rollbackOnFailure": "true",
+        "bulkSize": 1,
+        "modelInfo": {
+          "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+          "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+          "modelName": "ComplexService",
+          "modelVersion": "1.0",
+          "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+        },
+        "isALaCarte": false,
+        "name": "ComplexService",
+        "version": "1.0",
+        "description": "ComplexService",
+        "category": "Emanuel",
+        "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+        "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "serviceType": "",
+        "serviceRole": "",
+        "isMultiStepDesign": false
+      }
+    },
+    "lcpRegionsAndTenants": {
+      "lcpRegionList": [
+        {
+          "id": "JANET25",
+          "name": "JANET25",
+          "isPermitted": true
+        },
+        {
+          "id": "hvf6",
+          "name": "hvf6",
+          "isPermitted": true
+        }
+        ],
+      "lcpRegionsTenantsMap": {
+        "JANET25": [
+          {
+            "id": "092eb9e8e4b7412e8787dd091bc58e86",
+            "name": "USP-SIP-IC-24335-T-01",
+            "isPermitted": true
+          }
+          ],
+        "hvf6": [
+          {
+            "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+            "name": "AIN Web Tool-15-D-testalexandria",
+            "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-hvf6-09",
+            "isPermitted": true
+          },
+          {
+            "id": "cbb99fe4ada84631b7baf046b6fd2044",
+            "name": "DN5242-Nov16-T3",
+            "isPermitted": true
+          }
+          ]
+      }
+    },
+    "productFamilies": [
+      {
+        "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+        "name": "SCOTTIE",
+        "isPermitted": true
+      },
+      {
+        "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+        "name": "IGNACIO",
+        "isPermitted": true
+      },
+      {
+        "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+        "name": "Christie",
+        "isPermitted": true
+      },
+      {
+        "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+        "name": "Enhanced Services",
+        "isPermitted": true
+      },
+      {
+        "id": "vTerrance",
+        "name": "vTerrance",
+        "isPermitted": true
+      },
+      {
+        "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+        "name": "vSCP",
+        "isPermitted": true
+      },
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "name": "Emanuel",
+        "isPermitted": true
+      },
+      {
+        "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+        "name": "BVOIP",
+        "isPermitted": true
+      },
+      {
+        "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+        "name": "LINDSEY",
+        "isPermitted": true
+      },
+      {
+        "id": "LRSI-OSPF",
+        "name": "LRSI-OSPF",
+        "isPermitted": true
+      },
+      {
+        "id": "vRosemarie",
+        "name": "HNGATEWAY",
+        "isPermitted": true
+      },
+      {
+        "id": "vHNPaas",
+        "name": "WILKINS",
+        "isPermitted": true
+      },
+      {
+        "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "name": "TYLER SILVIA",
+        "isPermitted": true
+      },
+      {
+        "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+        "name": "VROUTER",
+        "isPermitted": true
+      },
+      {
+        "id": "Cisneros",
+        "name": "vMuriel",
+        "isPermitted": true
+      },
+      {
+        "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+        "name": "CARA Griffin",
+        "isPermitted": true
+      },
+      {
+        "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+        "name": "DARREN MCGEE",
+        "isPermitted": true
+      },
+      {
+        "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+        "name": "Transport",
+        "isPermitted": true
+      },
+      {
+        "id": "vSalvatore",
+        "name": "vSalvatore",
+        "isPermitted": true
+      },
+      {
+        "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+        "name": "Josefina",
+        "isPermitted": true
+      },
+      {
+        "id": "vHubbard",
+        "name": "vHubbard",
+        "isPermitted": true
+      },
+      {
+        "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+        "name": "DARREN MCGEE",
+        "isPermitted": true
+      }
+      ],
+    "serviceTypes": {
+      "e433710f-9217-458d-a79d-1c7aff376d89": [
+        {
+          "id": "0",
+          "name": "vRichardson",
+          "isPermitted": false
+        },
+        {
+          "id": "1",
+          "name": "TYLER SILVIA",
+          "isPermitted": true
+        },
+        {
+          "id": "2",
+          "name": "Emanuel",
+          "isPermitted": false
+        },
+        {
+          "id": "3",
+          "name": "vJamie",
+          "isPermitted": false
+        },
+        {
+          "id": "4",
+          "name": "vVoiceMail",
+          "isPermitted": false
+        },
+        {
+          "id": "5",
+          "name": "Kennedy",
+          "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": "LINDSEY",
+          "isPermitted": false
+        },
+        {
+          "id": "17",
+          "name": "JOHANNA_SANTOS",
+          "isPermitted": false
+        },
+        {
+          "id": "18",
+          "name": "vCarroll",
+          "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": "WayneHolland"
+        },
+        {
+          "id": "Melissa",
+          "name": "Melissa"
+        }
+        ],
+      "projectList": [
+        {
+          "id": "WATKINS",
+          "name": "WATKINS"
+        },
+        {
+          "id": "x1",
+          "name": "x1"
+        },
+        {
+          "id": "yyy1",
+          "name": "yyy1"
+        }
+        ],
+      "lineOfBusinessList": [
+        {
+          "id": "ONAP",
+          "name": "ONAP"
+        },
+        {
+          "id": "zzz1",
+          "name": "zzz1"
+        }
+        ],
+      "platformList": [
+        {
+          "id": "platform",
+          "name": "platform"
+        },
+        {
+          "id": "xxx1",
+          "name": "xxx1"
+        }
+        ]
+    },
+    "type": "[LCP_REGIONS_AND_TENANTS] Update",
+    "subscribers": [
+      {
+        "id": "CAR_2020_ER",
+        "name": "CAR_2020_ER",
+        "isPermitted": true
+      },
+      {
+        "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+        "name": "JULIO ERICKSON",
+        "isPermitted": false
+      },
+      {
+        "id": "DHV1707-TestSubscriber-2",
+        "name": "DALE BRIDGES",
+        "isPermitted": false
+      },
+      {
+        "id": "DHV1707-TestSubscriber-1",
+        "name": "LLOYD BRIDGES",
+        "isPermitted": false
+      },
+      {
+        "id": "jimmy-example",
+        "name": "JimmyExampleCust-20161102",
+        "isPermitted": false
+      },
+      {
+        "id": "jimmy-example2",
+        "name": "JimmyExampleCust-20161103",
+        "isPermitted": false
+      },
+      {
+        "id": "ERICA5779-TestSub-PWT-102",
+        "name": "ERICA5779-TestSub-PWT-102",
+        "isPermitted": false
+      },
+      {
+        "id": "ERICA5779-TestSub-PWT-101",
+        "name": "ERICA5779-TestSub-PWT-101",
+        "isPermitted": false
+      },
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "name": "Emanuel",
+        "isPermitted": false
+      },
+      {
+        "id": "ERICA5779-Subscriber-4",
+        "name": "ERICA5779-Subscriber-5",
+        "isPermitted": false
+      },
+      {
+        "id": "ERICA5779-TestSub-PWT-103",
+        "name": "ERICA5779-TestSub-PWT-103",
+        "isPermitted": false
+      },
+      {
+        "id": "ERICA5779-Subscriber-2",
+        "name": "ERICA5779-Subscriber-2",
+        "isPermitted": false
+      },
+      {
+        "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "name": "SILVIA ROBBINS",
+        "isPermitted": true
+      },
+      {
+        "id": "ERICA5779-Subscriber-3",
+        "name": "ERICA5779-Subscriber-3",
+        "isPermitted": false
+      },
+      {
+        "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+        "name": "CRAIG/ROBERTS",
+        "isPermitted": false
+      }
+      ]
+  }
+}
+}
+}
+
+class MockFeatureFlagsService {}
+
+describe('Network Control Generator', () => {
+  let injector;
+  let service: NetworkControlGenerator;
+  let httpMock: HttpTestingController;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [NetworkControlGenerator,
+        GenericFormService,
+        BasicControlGenerator,
+        AaiService,
+        FormBuilder,
+        LogService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+
+    injector = getTestBed();
+    service = injector.get(NetworkControlGenerator);
+    httpMock = injector.get(HttpTestingController);
+  });
+
+  test('getMacroFormControls check for mandatory controls', () => {
+    const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const networkName : string = "ExtVL 0";
+    const networkStoreKey : string = "ExtVL 0";
+    const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false);
+
+    const mandatoryControls : string[] = [
+      FormControlNames.LCPCLOUD_REGION_ID,
+      'tenantId',
+      'platformName'
+    ];
+    for(let i = 0 ; i < mandatoryControls.length ; i++){
+      let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+      expect(requiredExist).toBeDefined();
+    }
+  });
+
+
+  test('getMacroFormControls should return instance name if isEcompName is true', () => {
+    const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const networkName : string = "ExtVL 1";
+    const networkStoreKey : string = "ExtVL 1";
+    const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false);
+
+    const controlsOrderNames = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.PRODUCT_FAMILY_ID,
+      FormControlNames.LCPCLOUD_REGION_ID ,
+      'legacyRegion',
+      'tenantId',
+      'platformName',
+      'lineOfBusiness'];
+
+
+
+    expect(controls.length).toEqual(7);
+    for(let i = 0 ; i < controls.length ; i++){
+      expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+    }
+  });
+
+  test('getMacroFormControls should return the correct order of controls', () => {
+    const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const networkName : string = "ExtVL 0";
+    const networkStoreKey : string = "ExtVL 0";
+    const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false);
+
+    const controlsOrderNames = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.PRODUCT_FAMILY_ID,
+      FormControlNames.LCPCLOUD_REGION_ID ,
+      'legacyRegion',
+      'tenantId',
+      'platformName',
+      'lineOfBusiness'];
+
+
+
+    expect(controls.length).toEqual(7);
+    for(let i = 0 ; i < controls.length ; i++){
+      expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+    }
+  });
+
+  test('getMacroFormControls should not return the rollback status', () => {
+    const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const networkName : string = "ExtVL 0";
+    const networkStoreKey : string = "ExtVL 0";
+    const controls :FormControlModel[] = service.getMacroFormControls(serviceId, networkStoreKey, networkName, false);
+
+    const controlsOrderNames = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.PRODUCT_FAMILY_ID,
+      FormControlNames.LCPCLOUD_REGION_ID ,
+      'legacyRegion',
+      'tenantId',
+      'platformName',
+      'lineOfBusiness',
+      FormControlNames.ROLLBACK_ON_FAILURE
+    ];
+
+
+
+    expect(controls.length).toEqual(7);
+    for(let i = 0 ; i < controls.length ; i++){
+      expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+    }
+  });
+
+  test('getAlacartFormControls should return the correct order of controls', () => {
+    const controls:FormControlModel[] = getAlaCarteFormControls();
+
+    const controlsOrderNames = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.PRODUCT_FAMILY_ID,
+      FormControlNames.LCPCLOUD_REGION_ID,
+      'legacyRegion',
+      'tenantId',
+      'platformName',
+      'lineOfBusiness',
+      'rollbackOnFailure'];
+    expect(controls.length).toEqual(8);
+    for(let i = 0 ; i < controls.length ; i++) {
+      expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+    }
+  });
+
+  function getAlaCarteFormControls(): FormControlModel[] {
+    const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const networkName: string = "ExtVL 0";
+    const networkStoreKey: string = "ExtVL 0";
+    const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, networkStoreKey, networkName, false);
+    return controls;
+  }
+
+  test('getAlacartFormControls instance name control validator shall have the expected regex', () => {
+    const controls:FormControlModel[] = getAlaCarteFormControls();
+
+    const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME);
+    const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern);
+    expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/);
+  });
+
+  test('getAlacartFormControls check for mandatory controls', () => {
+    const controls:FormControlModel[] = getAlaCarteFormControls();
+
+    const mandatoryControls : string[] = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.LCPCLOUD_REGION_ID,
+      'tenantId',
+      'platformName',
+      'rollbackOnFailure'
+    ];
+    for(let i = 0 ; i < mandatoryControls.length ; i++){
+      let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+      expect(requiredExist).toBeDefined();
+    }
+  });
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.ts
new file mode 100644 (file)
index 0000000..c3a6223
--- /dev/null
@@ -0,0 +1,247 @@
+import {Injectable} from "@angular/core";
+import {GenericFormService} from "../../generic-form.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {NgRedux} from "@angular-redux/store";
+import {HttpClient} from "@angular/common/http";
+import {BasicControlGenerator} from "../basic.control.generator";
+import * as _ from 'lodash';
+import {Observable, of} from "rxjs";
+
+import {
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {AppState} from "../../../../store/reducers";
+import {FormGroup} from "@angular/forms";
+import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model";
+import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum";
+import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
+import {SelectOption} from "../../../../models/selectOption";
+import {NetworkInstance} from "../../../../models/networkInstance";
+import {NetworkModel} from "../../../../models/networkModel";
+import {Constants} from "../../../../utils/constants";
+
+export enum FormControlNames {
+  INSTANCE_NAME = 'instanceName',
+  GLOBAL_SUBSCRIBER_ID = 'globalSubscriberId',
+  PRODUCT_FAMILY_ID = 'productFamilyId',
+  LCPCLOUD_REGION_ID = 'lcpCloudRegionId',
+  TENANT_ID = 'tenantId',
+  AICZONE_ID = 'aicZoneId',
+  ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
+  LEGACY_REGION = 'legacyRegion'
+}
+
+
+enum InputType {
+  LCP_REGION = "lcpCloudRegionId",
+  TENANT = "tenantId",
+  LOB = "lineOfBusiness",
+  PLATFORM = "platformName",
+  ROLLBACK = "rollbackOnFailure",
+  PRODUCT_FAMILY = "productFamilyId",
+  VG = "volumeGroupName"
+}
+
+@Injectable()
+export class NetworkControlGenerator {
+  aaiService: AaiService;
+
+  constructor(private genericFormService: GenericFormService,
+              private _basicControlGenerator: BasicControlGenerator,
+              private store: NgRedux<AppState>,
+              private http: HttpClient,
+              private _aaiService: AaiService,
+              private _logService: LogService) {
+    this.aaiService = _aaiService;
+  }
+
+  getNetworkInstance = (serviceId: string, networkName: string, isUpdateMode : boolean): NetworkInstance => {
+    let networkInstance : NetworkInstance = null;
+    if (isUpdateMode && this.store.getState().service.serviceInstance[serviceId] && _.has(this.store.getState().service.serviceInstance[serviceId].networks, networkName)) {
+      networkInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId].networks[networkName]);
+    }
+    return networkInstance;
+  };
+
+
+  getMacroFormControls(serviceId: string, networkStoreKey: string, networkName: string, isUpdateMode : boolean): FormControlModel[] {
+    networkStoreKey = _.isNil(networkStoreKey) ? networkName : networkStoreKey;
+
+    if (_.isNil(serviceId) || _.isNil(networkStoreKey) || _.isNil(networkName)) {
+      this._logService.error('should provide serviceId, networkName, networkStoreKey', serviceId);
+      return [];
+    }
+
+    const networkInstance = this.getNetworkInstance(serviceId, networkStoreKey, isUpdateMode);
+    const networkModel = new NetworkModel(this.store.getState().service.serviceHierarchy[serviceId].networks[networkName]);
+    let result: FormControlModel[] = [];
+
+    if (!_.isNil(networkModel)) {
+      result.push(this.getInstanceName(networkInstance, serviceId, networkName, networkModel.isEcompGeneratedNaming));
+      result.push(this._basicControlGenerator.getProductFamilyControl(networkInstance, result, false));
+      result.push(this.getLcpRegionControl(serviceId, networkInstance, result));
+      result.push(this._basicControlGenerator.getLegacyRegion(networkInstance));
+      result.push(this.getTenantControl(serviceId, networkInstance, result));
+      result.push(this.getPlatformControl(networkInstance, result));
+      result.push(this.getLineOfBusinessControl(networkInstance, result));
+    }
+    return result;
+
+  }
+
+  getAlaCarteFormControls(serviceId: string, networkStoreKey: string, networkName: string, isUpdateMode : boolean): FormControlModel[] {
+    networkStoreKey = _.isNil(networkStoreKey) ? networkName : networkStoreKey;
+    if (_.isNil(serviceId) || _.isNil(networkStoreKey) || _.isNil(networkName)) {
+      this._logService.error('should provide serviceId, networkName, networkStoreKey', serviceId);
+      return [];
+    }
+
+    let result: FormControlModel[] = [];
+    const networkInstance = this.getNetworkInstance(serviceId, networkStoreKey, isUpdateMode);
+    const networkModel = new NetworkModel(this.store.getState().service.serviceHierarchy[serviceId].networks[networkName]);
+
+    if (!_.isNil(networkModel)) {
+      result.push(this.getInstanceName(networkInstance, serviceId, networkName, networkModel.isEcompGeneratedNaming));
+      result.push(this._basicControlGenerator.getProductFamilyControl(networkInstance, result, false));
+      result.push(this.getLcpRegionControl(serviceId, networkInstance, result));
+      result.push(this._basicControlGenerator.getLegacyRegion(networkInstance));
+      result.push(this.getTenantControl(serviceId, networkInstance, result));
+      result.push(this.getPlatformControl(networkInstance, result));
+      result.push(this.getLineOfBusinessControl(networkInstance, result));
+      result.push(this.getRollbackOnFailureControl(networkInstance, result));
+    }
+    return result;
+
+  }
+
+  isInputShouldBeShown = (inputType: any): boolean => {
+    let networkInputs = [InputType.LCP_REGION, InputType.LOB, InputType.TENANT, InputType.PRODUCT_FAMILY, InputType.PLATFORM, InputType.ROLLBACK];
+    return networkInputs.indexOf(inputType) > -1;
+  };
+
+  getInstanceName(instance : any, serviceId : string, networkName : string, isEcompGeneratedNaming: boolean): FormControlModel {
+    const networkModel : NetworkModel = this.store.getState().service.serviceHierarchy[serviceId].networks[networkName];
+    return this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, networkModel);
+  }
+
+  getLineOfBusinessControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: 'lineOfBusiness',
+      displayName: 'Line of business',
+      dataTestId: 'lineOfBusiness',
+      placeHolder: 'Select Line Of Business',
+      isDisabled: false,
+      name: "lineOfBusiness",
+      value: instance ? instance.lineOfBusiness : null,
+      validations: [],
+      onInitSelectedField: ['lineOfBusinessList'],
+      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+    })
+  };
+
+  getPlatformControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: 'platformName',
+      displayName: 'Platform',
+      dataTestId: 'platform',
+      placeHolder: 'Select Platform',
+      isDisabled: false,
+      name: "platform",
+      value: instance ? instance.platformName : null,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInitSelectedField: ['platformList'],
+      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+    })
+  };
+
+  getTenantControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    const service = this.store.getState().service.serviceInstance[serviceId];
+    const globalCustomerId: string = service.globalSubscriberId;
+    const serviceType: string = service.subscriptionServiceType;
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: FormControlNames.TENANT_ID,
+      displayName: 'Tenant',
+      dataTestId: 'tenant',
+      placeHolder: 'Select Tenant',
+      name: "tenant",
+      isDisabled: _.isNil(instance) || _.isNil(instance.lcpCloudRegionId),
+      onInitSelectedField: instance ? ['lcpRegionsTenantsMap', instance.lcpCloudRegionId] : null,
+      value: instance ? instance.tenantId : null,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInit : instance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+        this._aaiService,
+        this.aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)) : ()=>{},
+    })
+  };
+
+  getLcpRegionControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    const service = this.store.getState().service.serviceInstance[serviceId];
+    const globalCustomerId: string = service.globalSubscriberId;
+    const serviceType: string = service.subscriptionServiceType;
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: 'lcpCloudRegionId',
+      displayName: 'LCP region',
+      dataTestId: 'lcpRegion',
+      placeHolder: 'Select LCP Region',
+      name: "lcpRegion",
+      isDisabled: false,
+      value: instance ? instance.lcpCloudRegionId : null,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInitSelectedField: ['lcpRegionList'],
+      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(
+        this._aaiService,
+        this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)),
+      onChange: (param: string, form: FormGroup) => {
+        form.controls[FormControlNames.TENANT_ID].enable();
+        form.controls[FormControlNames.TENANT_ID].reset();
+        if (!_.isNil(globalCustomerId) && !_.isNil(serviceType)) {
+          this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res => {
+            controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param];
+            if(res.lcpRegionsTenantsMap[param]){
+              controls.find(item => item.controlName === FormControlNames.TENANT_ID)['hasEmptyOptions'] = res.lcpRegionsTenantsMap[param].length === 0;
+            }
+          }));
+        }
+
+        if (Constants.LegacyRegion.MEGA_REGION.indexOf(param) !== -1) {
+          form.controls['legacyRegion'].enable();
+          controls.find(item => item.controlName === 'legacyRegion').isVisible = true;
+
+        } else {
+          controls.find(item => item.controlName === 'legacyRegion').isVisible = false;
+          form.controls['legacyRegion'].setValue(null);
+          form.controls['legacyRegion'].reset();
+          form.controls['legacyRegion'].disable();
+        }
+      }
+    })
+  };
+
+  getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: FormControlNames.ROLLBACK_ON_FAILURE,
+      displayName: 'Rollback on failure',
+      dataTestId: 'rollback',
+      placeHolder: 'Rollback on failure',
+      isDisabled: false,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      value: instance ? instance.rollbackOnFailure : 'true',
+      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions)
+    })
+  };
+
+  getRollBackOnFailureOptions = (): Observable<SelectOption[]> => {
+    return of([
+      new SelectOption({id: 'true', name: 'Rollback'}),
+      new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+    ]);
+  };
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.spec.ts
new file mode 100644 (file)
index 0000000..b7a728c
--- /dev/null
@@ -0,0 +1,1859 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from '@angular-redux/store';
+import {FormControlNames, ServiceControlGenerator} from "./service.control.generator";
+import {BasicControlGenerator} from "./basic.control.generator";
+import {AaiService} from "../../../services/aaiService/aai.service";
+import {GenericFormService} from "../generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {FormControlModel, ValidatorModel, ValidatorOptions} from "../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../utils/log/log.service";
+import {FormControlType} from "../../../models/formControlModels/formControlTypes.enum";
+import {DropdownFormControl} from "../../../models/formControlModels/dropdownFormControl.model";
+import {FeatureFlagsService} from "../../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T> {
+  getState(){
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": "Emanuel",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "ComplexService",
+              "serviceEcompNaming": "false",
+              "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": {
+                  "max_instances": 10,
+                  "min_instances": 1,
+                  "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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": "false",
+                  "sctp-a-IPv6_ethertype": "IPv6",
+                  "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "true",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": true
+                  },
+                  "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": true
+              },
+              "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": {}
+          }
+        },
+        "serviceInstance": {},
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [
+            {
+              "id": "JANET25",
+              "name": "JANET25",
+              "isPermitted": true
+            },
+            {
+              "id": "hvf6",
+              "name": "hvf6",
+              "isPermitted": true
+            }
+          ],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [
+              {
+                "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                "name": "USP-SIP-IC-24335-T-01",
+                "isPermitted": true
+              }
+            ],
+            "hvf6": [
+              {
+                "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "name": "AIN Web Tool-15-D-testalexandria",
+                "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-hvf6-09",
+                "isPermitted": true
+              },
+              {
+                "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                "name": "DN5242-Nov16-T3",
+                "isPermitted": true
+              }
+            ]
+          }
+        },
+        "productFamilies": [
+          {
+            "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "name": "SCOTTIE",
+            "isPermitted": true
+          },
+          {
+            "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "name": "IGNACIO",
+            "isPermitted": true
+          },
+          {
+            "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "name": "Christie",
+            "isPermitted": true
+          },
+          {
+            "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+            "name": "Enhanced Services",
+            "isPermitted": true
+          },
+          {
+            "id": "vTerrance",
+            "name": "vTerrance",
+            "isPermitted": true
+          },
+          {
+            "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+            "name": "vSCP",
+            "isPermitted": true
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": true
+          },
+          {
+            "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+            "name": "BVOIP",
+            "isPermitted": true
+          },
+          {
+            "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+            "name": "LINDSEY",
+            "isPermitted": true
+          },
+          {
+            "id": "LRSI-OSPF",
+            "name": "LRSI-OSPF",
+            "isPermitted": true
+          },
+          {
+            "id": "vRosemarie",
+            "name": "HNGATEWAY",
+            "isPermitted": true
+          },
+          {
+            "id": "vHNPaas",
+            "name": "WILKINS",
+            "isPermitted": true
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "TYLER SILVIA",
+            "isPermitted": true
+          },
+          {
+            "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+            "name": "VROUTER",
+            "isPermitted": true
+          },
+          {
+            "id": "Cisneros",
+            "name": "vMuriel",
+            "isPermitted": true
+          },
+          {
+            "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+            "name": "CARA Griffin",
+            "isPermitted": true
+          },
+          {
+            "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          },
+          {
+            "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+            "name": "Transport",
+            "isPermitted": true
+          },
+          {
+            "id": "vSalvatore",
+            "name": "vSalvatore",
+            "isPermitted": true
+          },
+          {
+            "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+            "name": "Josefina",
+            "isPermitted": true
+          },
+          {
+            "id": "vHubbard",
+            "name": "vHubbard",
+            "isPermitted": true
+          },
+          {
+            "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          }
+        ],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [
+            {
+              "id": "0",
+              "name": "vRichardson",
+              "isPermitted": false
+            },
+            {
+              "id": "1",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "2",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "3",
+              "name": "vJamie",
+              "isPermitted": false
+            },
+            {
+              "id": "4",
+              "name": "vVoiceMail",
+              "isPermitted": false
+            },
+            {
+              "id": "5",
+              "name": "Kennedy",
+              "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": "LINDSEY",
+              "isPermitted": false
+            },
+            {
+              "id": "17",
+              "name": "JOHANNA_SANTOS",
+              "isPermitted": false
+            },
+            {
+              "id": "18",
+              "name": "vCarroll",
+              "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": "WayneHolland"
+            },
+            {
+              "id": "Melissa",
+              "name": "Melissa"
+            }
+          ],
+          "projectList": [
+            {
+              "id": "WATKINS",
+              "name": "WATKINS"
+            },
+            {
+              "id": "x1",
+              "name": "x1"
+            },
+            {
+              "id": "yyy1",
+              "name": "yyy1"
+            }
+          ],
+          "lineOfBusinessList": [
+            {
+              "id": "ONAP",
+              "name": "ONAP"
+            },
+            {
+              "id": "zzz1",
+              "name": "zzz1"
+            }
+          ],
+          "platformList": [
+            {
+              "id": "platform",
+              "name": "platform"
+            },
+            {
+              "id": "xxx1",
+              "name": "xxx1"
+            }
+          ]
+        },
+        "type": "[LCP_REGIONS_AND_TENANTS] Update",
+        "subscribers": [
+          {
+            "id": "CAR_2020_ER",
+            "name": "CAR_2020_ER",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-2",
+            "name": "DALE BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-1",
+            "name": "LLOYD BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example",
+            "name": "JimmyExampleCust-20161102",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example2",
+            "name": "JimmyExampleCust-20161103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-102",
+            "name": "ERICA5779-TestSub-PWT-102",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-101",
+            "name": "ERICA5779-TestSub-PWT-101",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-4",
+            "name": "ERICA5779-Subscriber-5",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-103",
+            "name": "ERICA5779-TestSub-PWT-103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-2",
+            "name": "ERICA5779-Subscriber-2",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": true
+          },
+          {
+            "id": "ERICA5779-Subscriber-3",
+            "name": "ERICA5779-Subscriber-3",
+            "isPermitted": false
+          },
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          }
+        ]
+      }
+    }
+  }
+}
+
+class MockFeatureFlagsService {}
+
+describe('Service Control Generator', () => {
+  let injector;
+  let service: ServiceControlGenerator;
+  let httpMock: HttpTestingController;
+
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [ServiceControlGenerator,
+        GenericFormService,
+        BasicControlGenerator,
+        AaiService,
+        FormBuilder,
+        LogService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(ServiceControlGenerator);
+    httpMock = injector.get(HttpTestingController);
+
+  })().then(done).catch(done.fail));
+
+
+  test('ServiceControlGenerator should return the correct controls with correct order', () => {
+    const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const controls :FormControlModel[] = service.getMacroFormControls(serviceId);
+    const globalSubscriberIdControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.GLOBAL_SUBSCRIBER_ID);
+
+    expect(globalSubscriberIdControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined();
+    expect(globalSubscriberIdControl.dataTestId).toEqual('subscriberName');
+    expect(globalSubscriberIdControl.type).toEqual(FormControlType.DROPDOWN);
+    expect(globalSubscriberIdControl.isDisabled).toBeFalsy();
+    expect(globalSubscriberIdControl.placeHolder).toEqual('Select Subscriber Name');
+    expect(globalSubscriberIdControl.displayName).toEqual('Subscriber name');
+    expect(globalSubscriberIdControl.onInit).toBeDefined();
+    expect(globalSubscriberIdControl.onChange).toBeDefined();
+
+    const serviceTypeControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.SUBSCRIPTION_SERVICE_TYPE);
+    expect(serviceTypeControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined();
+    expect(serviceTypeControl.dataTestId).toEqual('serviceType');
+    expect(serviceTypeControl.type).toEqual(FormControlType.DROPDOWN);
+    expect(serviceTypeControl.isDisabled).toBeTruthy();
+    expect(serviceTypeControl.placeHolder).toEqual('Select Service Type');
+    expect(serviceTypeControl.displayName).toEqual('Service type');
+    expect(serviceTypeControl.onInit).toBeDefined();
+    expect(serviceTypeControl.onChange).toBeDefined();
+
+    const productFamilyControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.PRODUCT_FAMILY_ID);
+    expect(productFamilyControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined();
+    expect(productFamilyControl.dataTestId).toEqual('productFamily');
+    expect(productFamilyControl.type).toEqual(FormControlType.DROPDOWN);
+    expect(productFamilyControl.isDisabled).toBeFalsy();
+    expect(productFamilyControl.placeHolder).toEqual('Select Product Family');
+    expect(productFamilyControl.displayName).toEqual('Product family');
+    expect(productFamilyControl.onInit).toBeDefined();
+
+    const lcpRegionControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.LCPCLOUD_REGION_ID);
+    expect(lcpRegionControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined();
+    expect(lcpRegionControl.dataTestId).toEqual('lcpRegion');
+    expect(lcpRegionControl.type).toEqual(FormControlType.DROPDOWN);
+    expect(lcpRegionControl.isDisabled).toBeTruthy();
+    expect(lcpRegionControl.placeHolder).toEqual('Select LCP Region');
+    expect(lcpRegionControl.displayName).toEqual('LCP region');
+    expect(lcpRegionControl.onInit).toBeDefined();
+    expect(lcpRegionControl.onChange).toBeDefined();
+
+    const tenantControl : DropdownFormControl = <DropdownFormControl>controls.find(item => item.controlName === FormControlNames.TENANT_ID);
+    expect(tenantControl.validations.find(val => val.validatorName === ValidatorOptions.required)).toBeDefined();
+    expect(tenantControl.dataTestId).toEqual('tenant');
+    expect(tenantControl.type).toEqual(FormControlType.DROPDOWN);
+    expect(tenantControl.isDisabled).toBeTruthy();
+    expect(tenantControl.placeHolder).toEqual('Select Tenant');
+    expect(tenantControl.displayName).toEqual('Tenant');
+    expect(tenantControl.onInit).toBeDefined();
+    expect(tenantControl.onChange).toBeDefined();
+
+    const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME);
+    const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern);
+    expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/);
+  });
+
+
+  test('getMacroFormControls should return the correct order of controls', () => {
+    // Order the fields
+    // 1.      Instance name
+    // 2.      Subscriber name
+    // 3.      Service type
+    // 4.      Owning entity (fix Entity to entity)
+    // 5.      Product family
+    // 6.      LCP region
+    // 7.      Tenant
+    // 8.      AIC zone (fix Zone to zone)
+    // 9.      Pause on pause points
+    // 10.     Project
+    // 11.     Rollback on failure
+    const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const controls :FormControlModel[] = service.getMacroFormControls(serviceId);
+
+
+
+    const controlsOrderNames = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.GLOBAL_SUBSCRIBER_ID,
+      FormControlNames.SUBSCRIPTION_SERVICE_TYPE ,
+      FormControlNames.OWNING_ENTITY_ID ,
+      FormControlNames.PRODUCT_FAMILY_ID ,
+      FormControlNames.LCPCLOUD_REGION_ID ,
+      FormControlNames.TENANT_ID ,
+      FormControlNames.AICZONE_ID ,
+      FormControlNames.PAUSE,
+      FormControlNames.PROJECT_NAME ,
+      FormControlNames.ROLLBACK_ON_FAILURE];
+    expect(controls.length).toEqual(11);
+    for(let i = 0 ; i < controls.length ; i++){
+      expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+    }
+  });
+
+  test('getAlacartFormControls should return the correct order of controls', () => {
+    // Order the fields
+    // 1.      Instance name
+    // 2.      Subscriber name
+    // 3.      Service type
+    // 4.      Owning entity (fix Entity to entity)
+    // 5.      Project
+    // 6.      Rollback on failure
+    const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const controls :FormControlModel[] = service.getAlaCartControls(serviceId);
+    const controlsOrderNames = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.GLOBAL_SUBSCRIBER_ID,
+      FormControlNames.SUBSCRIPTION_SERVICE_TYPE ,
+      FormControlNames.OWNING_ENTITY_ID ,
+      FormControlNames.PROJECT_NAME ,
+      FormControlNames.ROLLBACK_ON_FAILURE];
+
+    expect(controls.length).toEqual(6);
+    for(let i = 0 ; i < controls.length ; i++){
+      expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+    }
+  });
+
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.ts
new file mode 100644 (file)
index 0000000..539f848
--- /dev/null
@@ -0,0 +1,331 @@
+import {Injectable} from "@angular/core";
+import {GenericFormService} from "../generic-form.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../store/reducers";
+import {
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../models/formControlModels/formControl.model";
+import {DropdownFormControl} from "../../../models/formControlModels/dropdownFormControl.model";
+import * as _ from 'lodash';
+import {BasicControlGenerator} from "./basic.control.generator";
+import {AaiService} from "../../../services/aaiService/aai.service";
+import {FormGroup} from "@angular/forms";
+import {FormControlType} from "../../../models/formControlModels/formControlTypes.enum";
+import {HttpClient} from "@angular/common/http";
+import {SelectOption} from "../../../models/selectOption";
+import {Observable} from "rxjs";
+import {LogService} from "../../../utils/log/log.service";
+import {ServiceModel} from "../../../models/serviceModel";
+import {of} from "rxjs";
+
+import {CheckboxFormControl} from "../../../models/formControlModels/checkboxFormControl.model";
+
+export enum FormControlNames {
+  INSTANCE_NAME = 'instanceName',
+  GLOBAL_SUBSCRIBER_ID = 'globalSubscriberId',
+  SUBSCRIPTION_SERVICE_TYPE = 'subscriptionServiceType',
+  PRODUCT_FAMILY_ID = 'productFamilyId',
+  LCPCLOUD_REGION_ID = 'lcpCloudRegionId',
+  TENANT_ID = 'tenantId',
+  AICZONE_ID = 'aicZoneId',
+  PROJECT_NAME = 'projectName',
+  OWNING_ENTITY_ID = 'owningEntityId',
+  ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
+  PAUSE = 'pause'
+}
+
+@Injectable()
+export class  ServiceControlGenerator {
+  aaiService : AaiService;
+  constructor(private genericFormService : GenericFormService,
+              private _basicControlGenerator : BasicControlGenerator,
+              private store: NgRedux<AppState>,
+              private http: HttpClient,
+              private _aaiService : AaiService,
+              private _logService : LogService){
+    this.aaiService = _aaiService;
+  }
+
+  getServiceInstance = (serviceId : string) : any => {
+    let serviceInstance = null;
+    if (_.has(this.store.getState().service.serviceInstance, serviceId)) {
+      serviceInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId]);
+    }
+
+    return serviceInstance;
+  };
+
+  getAlaCartControls(serviceId: string, dynamicInputs?: any[]) : FormControlModel[] {
+    if(_.isNil(serviceId)){
+      this._logService.error('should provide serviceId', serviceId);
+      return [];
+    }
+    const serviceInstance = this.getServiceInstance(serviceId);
+
+    let result : FormControlModel[] = [];
+
+    const serviceModel = new ServiceModel(this.store.getState().service.serviceHierarchy[serviceId]);
+    if(!_.isNil(serviceModel)){
+      result.push(this._basicControlGenerator.getInstanceName(serviceInstance, serviceId, serviceModel.isEcompGeneratedNaming));
+      result.push(this.getGlobalSubscriberControl(serviceInstance, result));
+      result.push(this.getServiceTypeControl(serviceInstance, result, false));
+      result.push(this.getOwningEntityControl(serviceInstance, result));
+      result.push(this.getProjectControl(serviceInstance, result));
+      result.push(this.getRollbackOnFailureControl(serviceInstance, result));
+    }
+
+    this._logService.info('Generate dynamic service controls, is edit mode: ' + serviceInstance != null , result);
+    return result;
+  }
+
+  getMacroFormControls(serviceId: string, dynamicInputs?: any[]) : FormControlModel[] {
+    if(_.isNil(serviceId)){
+      this._logService.error('should provide serviceId', serviceId);
+      return [];
+    }
+
+    const serviceInstance = this.getServiceInstance(serviceId);
+
+    let result : FormControlModel[] = [];
+    const serviceModel = new ServiceModel(this.store.getState().service.serviceHierarchy[serviceId]);
+    if(!_.isNil(serviceModel)){
+      result.push(this._basicControlGenerator.getInstanceName(serviceInstance, serviceId, serviceModel.isEcompGeneratedNaming));
+      result.push(this.getGlobalSubscriberControl(serviceInstance, result));
+      result.push(this.getServiceTypeControl(serviceInstance, result, true));
+      result.push(this.getOwningEntityControl(serviceInstance, result));
+      result.push(this.getProductFamilyControl(serviceInstance, result));
+      result.push(this.getLcpRegionControl(serviceInstance, result));
+      result.push(this.getTenantControl(serviceInstance, result),);
+      result.push(this.getAICZoneControl(serviceInstance, result));
+
+      if(serviceModel.isMultiStepDesign){
+        result.push(new CheckboxFormControl({
+          controlName : FormControlNames.PAUSE,
+          displayName : 'Pause on pause points',
+          dataTestId : 'Pause',
+          isDisabled : false,
+          validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+          value : serviceInstance ? serviceInstance.pause : null,
+        }));
+      }
+
+      result.push(this.getProjectControl(serviceInstance, result));
+      result.push(this.getRollbackOnFailureControl(serviceInstance, result));
+    }
+
+
+    this._logService.info('Generate dynamic service controls, is edit mode: ' + serviceInstance != null , result);
+    return result;
+  }
+
+  getRollBackOnFailureOptions = () : Observable<SelectOption[]> =>{
+    return of([
+      new SelectOption({id: 'true', name: 'Rollback'}),
+      new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+    ]);
+  };
+
+  getGlobalSubscriberControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl  => {
+    return new DropdownFormControl({
+      type : FormControlType.DROPDOWN,
+      controlName : FormControlNames.GLOBAL_SUBSCRIBER_ID,
+      displayName : 'Subscriber name',
+      dataTestId : 'subscriberName',
+      placeHolder : 'Select Subscriber Name',
+      isDisabled : false,
+      name : "subscriber-name-select",
+      value : serviceInstance ? serviceInstance.globalSubscriberId : null,
+      validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInit : this._basicControlGenerator.getSubscribeInitResult.bind(this._aaiService, this.aaiService.getSubscribers),
+      onChange :  (param: string, form : FormGroup) => {
+        form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].reset();
+        if(!_.isNil(param)){
+          form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].enable();
+          this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getServiceTypes(param).subscribe(res =>{
+            controls.find(item => item.controlName === FormControlNames.SUBSCRIPTION_SERVICE_TYPE)['options$'] = res;
+          }));
+        }
+        else {
+          form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].disable();
+        }
+      }
+    })
+  };
+
+  getServiceTypeControl = (serviceInstance : any, controls : FormControlModel[], isMacro?: boolean) : DropdownFormControl => {
+    return new DropdownFormControl({
+      type : FormControlType.DROPDOWN,
+      controlName : FormControlNames.SUBSCRIPTION_SERVICE_TYPE,
+      displayName : 'Service type',
+      dataTestId : 'serviceType',
+      placeHolder : 'Select Service Type',
+      selectedField : 'name',
+      name : "service-type",
+      isDisabled : _.isNil(serviceInstance),
+      value : serviceInstance ? serviceInstance.subscriptionServiceType : null,
+      validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInit : serviceInstance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+        this._aaiService,
+        this.aaiService.getServiceTypes.bind(this, serviceInstance.globalSubscriberId)) : ()=>{},
+      onChange :  (param: string, form : FormGroup) => {
+        if(isMacro){
+          form.controls[FormControlNames.LCPCLOUD_REGION_ID].reset();
+          if(!_.isNil(param)) {
+            form.controls[FormControlNames.LCPCLOUD_REGION_ID].enable();
+            const globalCustomerId: string = form.controls[FormControlNames.GLOBAL_SUBSCRIBER_ID].value;
+            if (!_.isNil(globalCustomerId)) {
+              this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, param).subscribe(res => {
+                controls.find(item => item.controlName === FormControlNames.LCPCLOUD_REGION_ID)['options$'] = res.lcpRegionList;
+              }));
+            }
+          }
+          else {
+            form.controls[FormControlNames.LCPCLOUD_REGION_ID].disable();
+          }
+        }
+
+      }
+    })
+  };
+
+  getOwningEntityControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+    return new DropdownFormControl({
+      type : FormControlType.DROPDOWN,
+      controlName : FormControlNames.OWNING_ENTITY_ID,
+      displayName : 'Owning entity',
+      dataTestId : 'owningEntity',
+      placeHolder : 'Select Owning Entity',
+      name :"owningEntity",
+      isDisabled : false,
+      validations : [new ValidatorModel(ValidatorOptions.required, 'is required'),],
+      onInitSelectedField : ['owningEntityList'],
+      value : serviceInstance ? serviceInstance.owningEntityId : null,
+      onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+    })
+  };
+
+  getProductFamilyControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+    return new DropdownFormControl({
+      type : FormControlType.DROPDOWN,
+      controlName : FormControlNames.PRODUCT_FAMILY_ID,
+      displayName : 'Product family',
+      dataTestId : 'productFamily',
+      placeHolder : 'Select Product Family',
+      isDisabled : false,
+      name : "product-family-select",
+      value : serviceInstance ? serviceInstance.productFamilyId : null,
+      validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInit : this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getProductFamilies),
+    })
+  };
+
+  getLcpRegionControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+    return new DropdownFormControl({
+      type : FormControlType.DROPDOWN,
+      controlName : FormControlNames.LCPCLOUD_REGION_ID,
+      displayName : 'LCP region',
+      dataTestId : 'lcpRegion',
+      placeHolder : 'Select LCP Region',
+      name : "lcpRegion",
+      isDisabled : _.isNil(serviceInstance),
+      value : serviceInstance ? serviceInstance.lcpCloudRegionId : null,
+      validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInitSelectedField : ['lcpRegionList'],
+      onInit : serviceInstance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+        this._aaiService,
+        this.aaiService.getLcpRegionsAndTenants.bind(this, serviceInstance.globalSubscriberId, serviceInstance.subscriptionServiceType)) : ()=>{},
+      onChange :  (param: string, form : FormGroup) => {
+        form.controls[FormControlNames.TENANT_ID].reset();
+        if(param) {
+          form.controls[FormControlNames.TENANT_ID].enable();
+        }
+        else {
+          form.controls[FormControlNames.TENANT_ID].disable();
+        }
+        const globalCustomerId : string = form.controls[FormControlNames.GLOBAL_SUBSCRIBER_ID].value;
+        const serviceType : string = form.controls[FormControlNames.SUBSCRIPTION_SERVICE_TYPE].value;
+        if(!_.isNil(globalCustomerId) && !_.isNil(serviceType)){
+          this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res =>{
+            controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param];
+          }));
+        }
+      }
+    })
+  };
+
+  getTenantControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+    return  new DropdownFormControl({
+      type : FormControlType.DROPDOWN,
+      controlName : FormControlNames.TENANT_ID,
+      displayName : 'Tenant',
+      dataTestId : 'tenant',
+      placeHolder : 'Select Tenant',
+      name : "tenant",
+      isDisabled : _.isNil(serviceInstance),
+      onInitSelectedField :serviceInstance ?  ['lcpRegionsTenantsMap', serviceInstance.lcpCloudRegionId] : null,
+      onInit : serviceInstance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+        this._aaiService,
+        this.aaiService.getLcpRegionsAndTenants.bind(this, serviceInstance.globalSubscriberId, serviceInstance.subscriptionServiceType)) : ()=>{},
+      value : serviceInstance ? serviceInstance.tenantId : null,
+      validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+    })
+  };
+
+  getAICZoneControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+    return new DropdownFormControl({
+      type : FormControlType.DROPDOWN,
+      controlName : FormControlNames.AICZONE_ID,
+      displayName : 'AIC zone',
+      dataTestId : 'aic_zone',
+      placeHolder : 'Select AIC zone',
+      name : "aicZone",
+      value : serviceInstance ? serviceInstance.aicZoneId : null,
+      isDisabled : false,
+      validations : [],
+      onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getAicZones)
+    })
+  };
+
+  getPauseControl = (serviceInstance : any, controls : FormControlModel[]) :CheckboxFormControl => {
+    return  new CheckboxFormControl({
+      controlName : FormControlNames.PAUSE,
+      displayName : 'Pause on pause points',
+      dataTestId : 'Pause',
+      isDisabled : false,
+      value : serviceInstance ? serviceInstance.pause : null,
+    })
+  };
+
+  getProjectControl = (serviceInstance : any, controls : FormControlModel[]) :DropdownFormControl =>{
+    return new DropdownFormControl({
+      type : FormControlType.DROPDOWN,
+      controlName : FormControlNames.PROJECT_NAME,
+      displayName : 'Project',
+      dataTestId : 'project',
+      placeHolder : 'Select Project',
+      name : "project",
+      isDisabled : false,
+      validations : [],
+      value : serviceInstance ? serviceInstance.projectName : null,
+      onInitSelectedField : ['projectList'],
+      onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+    })
+  };
+
+  getRollbackOnFailureControl = (serviceInstance : any, controls : FormControlModel[]) : DropdownFormControl => {
+    return new DropdownFormControl({
+      type : FormControlType.DROPDOWN,
+      controlName : FormControlNames.ROLLBACK_ON_FAILURE,
+      displayName : 'Rollback on failure',
+      dataTestId : 'rollback',
+      isDisabled : false,
+      validations : [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      value : serviceInstance ? serviceInstance.rollbackOnFailure : 'true',
+      onInit : this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions)
+    })
+  };
+}
+
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts
new file mode 100644 (file)
index 0000000..36be1bd
--- /dev/null
@@ -0,0 +1,2008 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from '@angular-redux/store';
+import {BasicControlGenerator} from "../basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {GenericFormService} from "../../generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {LogService} from "../../../../utils/log/log.service";
+import {
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {FormControlNames, VfModuleControlGenerator} from "./vfModule.control.generator";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T> {
+  getState() {
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": "Emanuel",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "ComplexService",
+              "serviceEcompNaming": "false",
+              "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": {},
+                "serviceEcompNaming" : "true",
+                "properties": {
+                  "ecomp_generated_naming": "false",
+                  "max_instances": 10,
+                  "min_instances": 1,
+                  "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "true",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": true
+                  },
+                  "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": {
+                  "ecomp_generated_naming": "false",
+                  "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": true
+              },
+              "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": {}
+          }
+        },
+        "serviceInstance": {
+          "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+            "networks": {},
+            "vnfs": {
+              "VF_vMee 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "vf_vmee0..VfVmee..base_vmme..module-0": {
+                    "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+                      "isMissingData": false,
+                      "sdncPreReload": null,
+                      "modelInfo": {
+                        "modelType": "VFmodule",
+                        "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+                        "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+                        "modelName": "VfVmee..base_vmme..module-0",
+                        "modelVersion": "2",
+                        "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                        "modelCustomizationName": "VfVmee..base_vmme..module-0"
+                      },
+                      "instanceParams": [
+                        {}
+                      ],
+                      "trackById": "wmtm6sy2uj"
+                    }
+                  }
+                },
+                "isMissingData": true,
+                "originalName": "VF_vMee 0",
+                "vnfStoreKey": "VF_vMee 0",
+                "trackById": "p3wk448m5do",
+                "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+                "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+                "lcpCloudRegionId": null,
+                "tenantId": null,
+                "lineOfBusiness": null,
+                "platformName": null,
+                "modelInfo": {
+                  "modelType": "VF",
+                  "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+                  "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+                  "modelName": "VF_vMee",
+                  "modelVersion": "2.0",
+                  "modelCustomizationName": "VF_vMee 0"
+                }
+              }
+            },
+            "instanceParams": [
+              {}
+            ],
+            "validationCounter": 1,
+            "existingNames": {},
+            "existingVNFCounterMap": {
+              "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+            },
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "lcpCloudRegionId": "hvf6",
+            "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "aicZoneId": "JAG1",
+            "projectName": "x1",
+            "rollbackOnFailure": "true",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "modelName": "ComplexService",
+              "modelVersion": "1.0",
+              "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+            },
+            "isALaCarte": false,
+            "name": "ComplexService",
+            "version": "1.0",
+            "description": "ComplexService",
+            "category": "Emanuel",
+            "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isEcompGeneratedNaming": true,
+            "isMultiStepDesign": false
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [
+            {
+              "id": "JANET25",
+              "name": "JANET25",
+              "isPermitted": true
+            },
+            {
+              "id": "hvf6",
+              "name": "hvf6",
+              "isPermitted": true
+            }
+          ],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [
+              {
+                "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                "name": "USP-SIP-IC-24335-T-01",
+                "isPermitted": true
+              }
+            ],
+            "hvf6": [
+              {
+                "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "name": "AIN Web Tool-15-D-testalexandria",
+                "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-hvf6-09",
+                "isPermitted": true
+              },
+              {
+                "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                "name": "DN5242-Nov16-T3",
+                "isPermitted": true
+              }
+            ]
+          }
+        },
+        "productFamilies": [
+          {
+            "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "name": "SCOTTIE",
+            "isPermitted": true
+          },
+          {
+            "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "name": "IGNACIO",
+            "isPermitted": true
+          },
+          {
+            "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "name": "Christie",
+            "isPermitted": true
+          },
+          {
+            "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+            "name": "Enhanced Services",
+            "isPermitted": true
+          },
+          {
+            "id": "vTerrance",
+            "name": "vTerrance",
+            "isPermitted": true
+          },
+          {
+            "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+            "name": "vSCP",
+            "isPermitted": true
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": true
+          },
+          {
+            "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+            "name": "BVOIP",
+            "isPermitted": true
+          },
+          {
+            "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+            "name": "LINDSEY",
+            "isPermitted": true
+          },
+          {
+            "id": "LRSI-OSPF",
+            "name": "LRSI-OSPF",
+            "isPermitted": true
+          },
+          {
+            "id": "vRosemarie",
+            "name": "HNGATEWAY",
+            "isPermitted": true
+          },
+          {
+            "id": "vHNPaas",
+            "name": "WILKINS",
+            "isPermitted": true
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "TYLER SILVIA",
+            "isPermitted": true
+          },
+          {
+            "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+            "name": "VROUTER",
+            "isPermitted": true
+          },
+          {
+            "id": "Cisneros",
+            "name": "vMuriel",
+            "isPermitted": true
+          },
+          {
+            "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+            "name": "CARA Griffin",
+            "isPermitted": true
+          },
+          {
+            "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          },
+          {
+            "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+            "name": "Transport",
+            "isPermitted": true
+          },
+          {
+            "id": "vSalvatore",
+            "name": "vSalvatore",
+            "isPermitted": true
+          },
+          {
+            "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+            "name": "Josefina",
+            "isPermitted": true
+          },
+          {
+            "id": "vHubbard",
+            "name": "vHubbard",
+            "isPermitted": true
+          },
+          {
+            "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          }
+        ],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [
+            {
+              "id": "0",
+              "name": "vRichardson",
+              "isPermitted": false
+            },
+            {
+              "id": "1",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "2",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "3",
+              "name": "vJamie",
+              "isPermitted": false
+            },
+            {
+              "id": "4",
+              "name": "vVoiceMail",
+              "isPermitted": false
+            },
+            {
+              "id": "5",
+              "name": "Kennedy",
+              "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": "LINDSEY",
+              "isPermitted": false
+            },
+            {
+              "id": "17",
+              "name": "JOHANNA_SANTOS",
+              "isPermitted": false
+            },
+            {
+              "id": "18",
+              "name": "vCarroll",
+              "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": "WayneHolland"
+            },
+            {
+              "id": "Melissa",
+              "name": "Melissa"
+            }
+          ],
+          "projectList": [
+            {
+              "id": "WATKINS",
+              "name": "WATKINS"
+            },
+            {
+              "id": "x1",
+              "name": "x1"
+            },
+            {
+              "id": "yyy1",
+              "name": "yyy1"
+            }
+          ],
+          "lineOfBusinessList": [
+            {
+              "id": "ONAP",
+              "name": "ONAP"
+            },
+            {
+              "id": "zzz1",
+              "name": "zzz1"
+            }
+          ],
+          "platformList": [
+            {
+              "id": "platform",
+              "name": "platform"
+            },
+            {
+              "id": "xxx1",
+              "name": "xxx1"
+            }
+          ]
+        },
+        "type": "[LCP_REGIONS_AND_TENANTS] Update",
+        "subscribers": [
+          {
+            "id": "CAR_2020_ER",
+            "name": "CAR_2020_ER",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-2",
+            "name": "DALE BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-1",
+            "name": "LLOYD BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example",
+            "name": "JimmyExampleCust-20161102",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example2",
+            "name": "JimmyExampleCust-20161103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-102",
+            "name": "ERICA5779-TestSub-PWT-102",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-101",
+            "name": "ERICA5779-TestSub-PWT-101",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-4",
+            "name": "ERICA5779-Subscriber-5",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-103",
+            "name": "ERICA5779-TestSub-PWT-103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-2",
+            "name": "ERICA5779-Subscriber-2",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": true
+          },
+          {
+            "id": "ERICA5779-Subscriber-3",
+            "name": "ERICA5779-Subscriber-3",
+            "isPermitted": false
+          },
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          }
+        ]
+      }
+    }
+  }
+}
+
+class MockFeatureFlagsService {}
+
+describe('VFModule Control Generator', () => {
+  let injector;
+  let service: VfModuleControlGenerator;
+  let httpMock: HttpTestingController;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [VfModuleControlGenerator,
+        GenericFormService,
+        BasicControlGenerator,
+        AaiService,
+        FormBuilder,
+        LogService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(VfModuleControlGenerator);
+    httpMock = injector.get(HttpTestingController);
+    jest.spyOn(console, 'error');
+
+  })().then(done).catch(done.fail));
+
+  test(' getMacroFormControls gets vnfStoreKey === null', () => {
+    const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const vnfStoreKey: string = null;
+    const vfModuleStoreKey: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+    const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830";
+    const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, vfModuleUUID, true);
+
+    expect(controls).toEqual([]);
+    expect(console.error).toHaveBeenCalled();
+  });
+
+  test('getAlaCarteFormControls check for mandatory controls', () => {
+    const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const vnfStoreKey: string = 'VF_vMee 0';
+    const vfModuleStoreKey: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+    const uuidData: Object = {
+      modelId : "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+      modelName :  "vf_vmee0..VfVmee..base_vmme..module-0",
+      serviceId : "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+      type : "VFmodule",
+      vFModuleStoreKey : "vf_vmee0..VfVmee..base_vmme..module-0vmvzo",
+      vnfStoreKey : "VF_vMee 0"
+    };
+    const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, uuidData, true);
+
+    const mandatoryControls : string[] = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.LCPCLOUD_REGION_ID,
+      FormControlNames.TENANT_ID,
+      FormControlNames.ROLLBACK_ON_FAILURE,
+    ];
+
+    for(let i = 0 ; i < mandatoryControls.length ; i++) {
+      let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+      expect(requiredExist).toBeDefined();
+    }
+  });
+
+  test('getMacroFormControls check for mandatory controls', () => {
+    const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const vnfStoreKey: string = 'VF_vMee 0';
+    const uuidData: Object = {
+      modelId : "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+      modelName :  "vf_vmee0..VfVmee..base_vmme..module-0",
+      serviceId : "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+      type : "VFmodule",
+      vFModuleStoreKey : "vf_vmee0..VfVmee..base_vmme..module-0vmvzo",
+      vnfStoreKey : "VF_vMee 0"
+    };
+    const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfStoreKey, uuidData, true);
+
+    const mandatoryControls : string[] = [
+      'instanceName'
+    ];
+
+    for(let i = 0 ; i < mandatoryControls.length ; i++) {
+      let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+      expect(requiredExist).toBeDefined();
+    }
+  });
+
+  test(' getMacroFormControls gets null vnfStoreKey', () => {
+    const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const vnfStoreKey: string = null;
+    const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830";
+    const uuidData: Object = {};
+    const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vfModuleUUID, uuidData,true);
+
+    expect(controls).toEqual([]);
+    expect(console.error).toHaveBeenCalled();
+  });
+
+  test('getAlaCarteFormControls should return the correct order of controls', () => {
+    const controls:FormControlModel[] = getAlaCarteFormControls();
+
+    const orderedControls : string[] = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.VOLUME_GROUP_NAME,
+      FormControlNames.LCPCLOUD_REGION_ID,
+      FormControlNames.LEGACY_REGION,
+      FormControlNames.TENANT_ID,
+      FormControlNames.ROLLBACK_ON_FAILURE,
+      FormControlNames.SDN_C_PRE_LOAD
+    ];
+
+    expect(controls.length).toEqual(7);
+    for(let i = 0 ; i < orderedControls.length ; i++) {
+     expect(controls[i].controlName).toEqual(orderedControls[i]);
+    }
+  });
+
+  function getAlaCarteFormControls():FormControlModel[] {
+    const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const vnfStoreKey: string = 'VF_vMee 0';
+    const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830";
+    const uuidData: Object = {
+      modelId: "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+      modelName: "vf_vmee0..VfVmee..base_vmme..module-0",
+      serviceId: "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+      type: "VFmodule",
+      vFModuleStoreKey: "vf_vmee0..VfVmee..base_vmme..module-0vmvzo",
+      vnfStoreKey: "VF_vMee 0"
+    };
+    const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vfModuleUUID, uuidData, true);
+    return controls;
+  }
+
+  test('getAlaCarteFormControls responce with wrong order of controls', () => {
+    const controls:FormControlModel[] = getAlaCarteFormControls();
+
+    const orderedControls : string[] = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.VOLUME_GROUP_NAME,
+      FormControlNames.LCPCLOUD_REGION_ID,
+      FormControlNames.TENANT_ID, // TENANT_ID must be after LEGACY_REGION
+      FormControlNames.LEGACY_REGION,
+      FormControlNames.ROLLBACK_ON_FAILURE,
+      FormControlNames.SDN_C_PRE_LOAD
+    ];
+
+    for(let i = 0 ; i < orderedControls.length ; i++) {
+      if (controls[i].controlName === 'legacyRegion') {
+        expect(orderedControls[i]).toEqual('tenantId');
+      }
+    }
+  });
+
+  test('getMacroFormControls should return the correct order of controls', () => {
+    const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const vnfStoreKey: string = 'VF_vMee 0';
+    const vfModuleUUID: string = "522159d5-d6e0-4c2a-aa44-5a542a12a830";
+    const uuidData: Object = {
+      modelId : "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+      modelName :  "vf_vmee0..VfVmee..base_vmme..module-0",
+      serviceId : "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+      type : "VFmodule",
+      vFModuleStoreKey : "vf_vmee0..VfVmee..base_vmme..module-0vmvzo",
+      vnfStoreKey : "VF_vMee 0"
+    };
+    const controls: FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vfModuleUUID, uuidData, true);
+
+    const orderedControls : string[] = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.VOLUME_GROUP_NAME
+    ];
+
+    for(let i = 0 ; i < orderedControls.length ; i++) {
+      expect(controls[i].controlName).toEqual(orderedControls[i]);
+    }
+  });
+
+  test.each`
+    controllerName
+    ${'instanceName'}
+    ${'volumeGroupName'}
+  `('getAlacartFormControls $controllerName control validator shall have the expected regex', ({controllerName}) => {
+    const controls:FormControlModel[] = getAlaCarteFormControls();
+
+    const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName == controllerName);
+    const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern);
+    expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/);
+  });
+
+  test(' getAlaCarteFormControls gets null service', () => {
+    const controls:FormControlModel[] = getAlaCarteFormControls();
+    expect(controls.length).toEqual(7);
+
+    const orderedControls : string[] = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.VOLUME_GROUP_NAME,
+      FormControlNames.LCPCLOUD_REGION_ID,
+      FormControlNames.LEGACY_REGION,
+      FormControlNames.TENANT_ID,
+      FormControlNames.ROLLBACK_ON_FAILURE,
+      FormControlNames.SDN_C_PRE_LOAD
+    ];
+
+    for(let i = 0 ; i < orderedControls.length ; i++) {
+      expect(controls[i].controlName).toEqual(orderedControls[i]);
+    }
+  });
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.ts
new file mode 100644 (file)
index 0000000..3012c13
--- /dev/null
@@ -0,0 +1,349 @@
+import {Injectable} from "@angular/core";
+import {GenericFormService} from "../../generic-form.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {NgRedux} from "@angular-redux/store";
+import {HttpClient} from "@angular/common/http";
+import {BasicControlGenerator} from "../basic.control.generator";
+import * as _ from 'lodash';
+import {Observable, of} from "rxjs";
+
+import {
+  CustomValidatorOptions,
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {AppState} from "../../../../store/reducers";
+import {FormGroup} from "@angular/forms";
+import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model";
+import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum";
+import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
+import {SelectOption} from "../../../../models/selectOption";
+import {VfModuleInstance} from "../../../../models/vfModuleInstance";
+import {VfModule} from "../../../../models/vfModule";
+import {VNFModel} from "../../../../models/vnfModel";
+import {VnfInstance} from "../../../../models/vnfInstance";
+import {FileFormControl} from "../../../../models/formControlModels/fileFormControl.model";
+import {CheckboxFormControl} from "../../../../models/formControlModels/checkboxFormControl.model";
+import {FileUnit} from "../../../formControls/component/file/fileUnit.enum";
+import {Constants} from "../../../../utils/constants";
+
+
+export enum FormControlNames {
+  INSTANCE_NAME = 'instanceName',
+  VOLUME_GROUP_NAME = 'volumeGroupName',
+  LCPCLOUD_REGION_ID = 'lcpCloudRegionId',
+  LEGACY_REGION = 'legacyRegion',
+  TENANT_ID = 'tenantId',
+  ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
+  SDN_C_PRE_LOAD = 'sdncPreLoad',
+  SUPPLEMENTARY_FILE = 'supplementaryFile'
+}
+
+
+@Injectable()
+export class VfModuleControlGenerator {
+  aaiService: AaiService;
+  vfModuleModel: VfModule;
+  vfModuleName : string;
+  isUpdateMode : boolean;
+
+  constructor(private genericFormService: GenericFormService,
+              private _basicControlGenerator: BasicControlGenerator,
+              private store: NgRedux<AppState>,
+              private http: HttpClient,
+              private _aaiService: AaiService,
+              private _logService: LogService) {
+    this.aaiService = _aaiService;
+  }
+
+  setVFModuleStoreKey = (serviceId: string, vfModuleUuid: string) => {
+      const vfModules = this.store.getState().service.serviceHierarchy[serviceId].vfModules;
+      const vfModulesKeys = Object.keys(vfModules);
+      for(let key of  vfModulesKeys){
+        if(vfModules[key].uuid === vfModuleUuid){
+          this.vfModuleName = key;
+          return;
+        }
+      }
+  };
+
+
+  getVfModuleInstance = (serviceId: string, vnfStoreKey: string, UUIDData: Object, isUpdateMode: boolean): VfModuleInstance => {
+    let vfModuleInstance: VfModuleInstance = null;
+    if (isUpdateMode && this.store.getState().service.serviceInstance[serviceId] &&
+      _.has(this.store.getState().service.serviceInstance[serviceId].vnfs, vnfStoreKey) &&
+      _.has(this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules, UUIDData['modelName'])) {
+       vfModuleInstance = Object.assign({},this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules[UUIDData['modelName']][UUIDData['vFModuleStoreKey']]);
+    }
+    return vfModuleInstance;
+  };
+
+  extractVfAccordingToVfModuleUuid(serviceId: string, UUIDData: Object): VfModule {
+    const vfModule = this.store.getState().service.serviceHierarchy[serviceId].vfModules[UUIDData['modelName']];
+    this.vfModuleModel = vfModule;
+    return vfModule;
+  }
+
+  getMacroFormControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, uuidData : Object, isUpdateMode: boolean): FormControlModel[] {
+    this.isUpdateMode = isUpdateMode;
+    this.extractVfAccordingToVfModuleUuid(serviceId, uuidData);
+    if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) {
+      if(isUpdateMode){
+        this._logService.error('should provide serviceId, vfModuleStoreKey, vnfStoreKey', serviceId);
+        return [];
+      }
+    }
+
+    const vfModuleInstance = this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode);
+    const vfModuleModel = this.vfModuleModel;
+    const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey];
+    const vnfModelName: string = vnf.originalName;
+    const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfModelName]);
+
+    let result: FormControlModel[] = [];
+
+    if (!_.isNil(vfModuleModel)) {
+      result.push(this.getInstanceName(vfModuleInstance, serviceId, vnfModel.isEcompGeneratedNaming));
+      if (this.vfModuleModel.volumeGroupAllowed) {
+        result.push(this.getVolumeGroupName(vfModuleInstance, serviceId, vnfStoreKey, vfModuleInstance && vfModuleInstance.volumeGroupName, vnfModel.isEcompGeneratedNaming));
+     }
+    }
+    if(this.store.getState().global.flags['FLAG_SUPPLEMENTARY_FILE']) {
+      let suppFileInput:FileFormControl = <FileFormControl>(this.getSupplementaryFile(vfModuleInstance));
+      result.push(suppFileInput);
+      result = result.concat(suppFileInput.hiddenFile);
+    }
+    return result;
+  }
+
+  getAlaCarteFormControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, uuidData : Object, isUpdateMode: boolean): FormControlModel[] {
+    this.isUpdateMode = isUpdateMode;
+    this.extractVfAccordingToVfModuleUuid(serviceId, uuidData);
+    if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) {
+      if(isUpdateMode){
+        this._logService.error('should provide serviceId, vfModuleStoreKey, vnfStoreKey', serviceId);
+        return [];
+      }
+    }
+    const vnf: VnfInstance = this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey];
+    const vnfModelName: string = vnf.originalName;
+    const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfModelName]);
+
+    const vfModuleInstance = this.getVfModuleInstance(serviceId, vnfStoreKey, uuidData, isUpdateMode);
+    let result: FormControlModel[] = [];
+    result.push(this.getInstanceName(vfModuleInstance, serviceId, vnfModel.isEcompGeneratedNaming));
+
+    if (this.vfModuleModel.volumeGroupAllowed) {
+      result.push(this.getVolumeGroupName(vfModuleInstance, serviceId, vnfStoreKey, this.vfModuleName, vnfModel.isEcompGeneratedNaming));
+    }
+    result.push(this.getLcpRegionControl(serviceId, vfModuleInstance, result));
+    result.push(this._basicControlGenerator.getLegacyRegion(vfModuleInstance));
+    result.push(this.getTenantControl(serviceId, vfModuleInstance, result));
+    result.push(this.getRollbackOnFailureControl(vfModuleInstance, result));
+    result.push(this.getSDNCControl(vfModuleInstance, result));
+    if(this.store.getState().global.flags['FLAG_SUPPLEMENTARY_FILE']) {
+      let suppFileInput:FileFormControl = <FileFormControl>(this.getSupplementaryFile(vfModuleInstance));
+      result.push(suppFileInput);
+      result = result.concat(suppFileInput.hiddenFile);
+    }
+    return result;
+
+  }
+
+  getInstanceName(instance: any, serviceId: string, isEcompGeneratedNaming: boolean): FormControlModel {
+    let formControlModel:FormControlModel = this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, this.vfModuleModel);
+    formControlModel.onBlur = (event, form : FormGroup) => {
+        if(!_.isNil(form.controls['volumeGroupName'])&& event.target.value.length > 0){
+          form.controls['volumeGroupName'].setValue(event.target.value + "_vol");
+        }
+      };
+
+    return formControlModel;
+  }
+
+  getDefaultVolumeGroupName(instance: any, vfModuleName: string, isEcompGeneratedNaming: boolean): string {
+    if ((!_.isNil(instance) && instance.volumeGroupName))  {
+      return instance.volumeGroupName;
+    }
+    if (isEcompGeneratedNaming) {
+      return null;
+    }
+    return this._basicControlGenerator.getDefaultInstanceName(instance, this.vfModuleModel) + "_vol";
+  }
+
+  getVolumeGroupName(instance: any, serviceId: string, vnfStoreKey: string, vfModuleName: string, isEcompGeneratedNaming: boolean): FormControlModel {
+    let validations: ValidatorModel[] = [
+      new ValidatorModel(ValidatorOptions.pattern, 'Instance name may include only alphanumeric characters and underscore.', BasicControlGenerator.INSTANCE_NAME_REG_EX),
+      new ValidatorModel(CustomValidatorOptions.uniqueInstanceNameValidator, 'Volume Group instance name is already in use, please pick another name', [this.store, serviceId, instance && instance.volumeGroupName])
+    ];
+    // comment out because if not provided vid won't create VG
+    // if (!isEcompGeneratedNaming)  {
+    //   validations.push(new ValidatorModel(ValidatorOptions.required, 'is required'));
+    // }
+    return new InputFormControl({
+      controlName: 'volumeGroupName',
+      displayName: 'Volume Group Name',
+      dataTestId: 'volumeGroupName',
+      // placeHolder: (!isEcompGeneratedNaming) ? 'Volume Group Name' : 'Automatically generated when not provided',
+      validations: validations,
+      tooltip : 'When filled, VID will create a Volume Group by this name and associate with this module.\n' +
+                'When empty, the module is created without a Volume Group.',
+      isVisible: true,
+      value: this.getDefaultVolumeGroupName(instance, vfModuleName, isEcompGeneratedNaming),
+      onKeypress: (event) => {
+        const pattern:RegExp = BasicControlGenerator.INSTANCE_NAME_REG_EX;
+        if (pattern) {
+          if (!pattern.test(event['key'])) {
+            event.preventDefault();
+          }
+        }
+        return event;
+      }
+    });
+  }
+
+  getSupplementaryFile(instance: any): FormControlModel {
+    return new FileFormControl({
+      controlName: FormControlNames.SUPPLEMENTARY_FILE,
+      displayName: 'Supplementary Data File (JSON format)',
+      dataTestId: 'SupplementaryFile',
+      placeHolder: 'Choose file',
+      selectedFile:  !_.isNil(instance) ? instance.supplementaryFileName: null,
+      isVisible: true,
+      acceptedExtentions: "application/json",
+      hiddenFile : [new InputFormControl({
+        controlName: FormControlNames.SUPPLEMENTARY_FILE + "_hidden",
+        isVisible: false,
+        validations: [new ValidatorModel(CustomValidatorOptions.isFileTooBig, "File size exceeds 5MB.", [FileUnit.MB, 5])]
+      }),
+        new InputFormControl({
+          controlName: FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content",
+          isVisible: false,
+          validations: [new ValidatorModel(CustomValidatorOptions.isValidJson,
+            "File is invalid, please make sure a legal JSON file is uploaded using name:value pairs.",[]),
+            new ValidatorModel(CustomValidatorOptions.isStringContainTags,
+              "File is invalid, please remove tags <>.",[])],
+          value: !_.isNil(instance) ? (instance.supplementaryFile_hidden_content): null,
+        })
+      ],
+      onDelete : (form : FormGroup) => {
+        form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden"].setValue(null);
+        form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content"].setValue(null);
+      },
+      onChange : (files: FileList, form : FormGroup)  => {
+        if (files.length > 0) {
+          const file = files.item(0);
+          let reader = new FileReader();
+          reader.onload = function(event) {
+            form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content"].setValue(reader.result);
+            form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden"].setValue(file);
+          };
+          reader.readAsText(file);
+        }
+        else {
+          form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden"].setValue(null);
+          form.controls[FormControlNames.SUPPLEMENTARY_FILE + "_hidden_content"].setValue(null);
+        }
+      }
+    })
+  };
+
+  getTenantControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    const service = this.store.getState().service.serviceInstance[serviceId];
+    const globalCustomerId: string = service.globalSubscriberId;
+    const serviceType: string = service.subscriptionServiceType;
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: FormControlNames.TENANT_ID,
+      displayName: 'Tenant',
+      dataTestId: 'tenant',
+      placeHolder: 'Select Tenant',
+      name: "tenant",
+      isDisabled: _.isNil(instance) || _.isNil(instance.lcpCloudRegionId),
+      onInitSelectedField: instance ? ['lcpRegionsTenantsMap', instance.lcpCloudRegionId] : null,
+      value: instance ? instance.tenantId : null,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInit: instance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+        this._aaiService,
+        this.aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)) : () => {
+      },
+    })
+  };
+
+  getLcpRegionControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    const service = this.store.getState().service.serviceInstance[serviceId];
+    const globalCustomerId: string = service.globalSubscriberId;
+    const serviceType: string = service.subscriptionServiceType;
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: 'lcpCloudRegionId',
+      displayName: 'LCP region',
+      dataTestId: 'lcpRegion',
+      placeHolder: 'Select LCP Region',
+      name: "lcpRegion",
+      isDisabled: false,
+      value: instance ? instance.lcpCloudRegionId : null,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInitSelectedField: ['lcpRegionList'],
+      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(
+        this._aaiService,
+        this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)),
+      onChange: (param: string, form: FormGroup) => {
+        form.controls[FormControlNames.TENANT_ID].enable();
+        form.controls[FormControlNames.TENANT_ID].reset();
+        if (!_.isNil(globalCustomerId) && !_.isNil(serviceType)) {
+          this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res => {
+            controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param];
+            if (res.lcpRegionsTenantsMap[param]) {
+              controls.find(item => item.controlName === FormControlNames.TENANT_ID)['hasEmptyOptions'] = res.lcpRegionsTenantsMap[param].length === 0;
+            }
+          }));
+        }
+
+        if (Constants.LegacyRegion.MEGA_REGION.indexOf(param) !== -1) {
+          form.controls['legacyRegion'].enable();
+          controls.find(item => item.controlName === 'legacyRegion').isVisible = true;
+
+        } else {
+          controls.find(item => item.controlName === 'legacyRegion').isVisible = false;
+          form.controls['legacyRegion'].setValue(null);
+          form.controls['legacyRegion'].reset();
+          form.controls['legacyRegion'].disable();
+        }
+      }
+    })
+  };
+
+  getSDNCControl = (instance: any, controls: FormControlModel[]): CheckboxFormControl => {
+    return new CheckboxFormControl({
+      type: FormControlType.CHECKBOX,
+      controlName: 'sdncPreLoad',
+      displayName: 'SDN-C pre-load',
+      dataTestId: 'sdncPreLoad',
+      value: instance ? instance.sdncPreLoad : false,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')]
+    })
+  };
+
+  getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: FormControlNames.ROLLBACK_ON_FAILURE,
+      displayName: 'Rollback on failure',
+      dataTestId: 'rollback',
+      isDisabled: false,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      value: instance ? instance.rollbackOnFailure : 'true',
+      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions)
+    })
+  };
+
+  getRollBackOnFailureOptions = (): Observable<SelectOption[]> => {
+    return of([
+      new SelectOption({id: 'true', name: 'Rollback'}),
+      new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+    ]);
+  };
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.spec.ts
new file mode 100644 (file)
index 0000000..d15a57b
--- /dev/null
@@ -0,0 +1,1943 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from '@angular-redux/store';
+import {FormControlNames} from "../service.control.generator";
+import {BasicControlGenerator} from "../basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {GenericFormService} from "../../generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {VnfControlGenerator} from "./vnf.control.generator";
+import {Observable} from "rxjs";
+import {SelectOption} from "../../../../models/selectOption";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T> {
+  getState(){
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": "Emanuel",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "ComplexService",
+              "serviceEcompNaming": "false",
+              "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": {
+                  "max_instances": 10,
+                  "min_instances": 1,
+                  "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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": "false",
+                  "sctp-a-IPv6_ethertype": "IPv6",
+                  "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "true",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": true
+                  },
+                  "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": true
+              },
+              "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": {}
+          }
+        },
+        "serviceInstance": {
+          "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+            "vnfs": {
+              "VF_vMee 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "vf_vmee0..VfVmee..base_vmme..module-0": {
+                    "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+                      "isMissingData": false,
+                      "sdncPreReload": null,
+                      "modelInfo": {
+                        "modelType": "VFmodule",
+                        "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+                        "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+                        "modelName": "VfVmee..base_vmme..module-0",
+                        "modelVersion": "2",
+                        "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                        "modelCustomizationName": "VfVmee..base_vmme..module-0"
+                      },
+                      "instanceParams": [
+                        {}
+                      ],
+                      "trackById": "wmtm6sy2uj"
+                    }
+                  }
+                },
+                "isMissingData": true,
+                "originalName": "VF_vMee 0",
+                "vnfStoreKey": "VF_vMee 0",
+                "trackById": "p3wk448m5do",
+                "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+                "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+                "lcpCloudRegionId": null,
+                "tenantId": null,
+                "lineOfBusiness": null,
+                "platformName": null,
+                "modelInfo": {
+                  "modelType": "VF",
+                  "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+                  "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+                  "modelName": "VF_vMee",
+                  "modelVersion": "2.0",
+                  "modelCustomizationName": "VF_vMee 0"
+                }
+              }
+            },
+            "instanceParams": [
+              {}
+            ],
+            "validationCounter": 1,
+            "existingNames": {},
+            "existingVNFCounterMap": {
+              "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+            },
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "lcpCloudRegionId": "hvf6",
+            "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "aicZoneId": "JAG1",
+            "projectName": "x1",
+            "rollbackOnFailure": "true",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "modelName": "ComplexService",
+              "modelVersion": "1.0",
+              "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+            },
+            "isALaCarte": false,
+            "name": "ComplexService",
+            "version": "1.0",
+            "description": "ComplexService",
+            "category": "Emanuel",
+            "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isMultiStepDesign": false
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [
+            {
+              "id": "JANET25",
+              "name": "JANET25",
+              "isPermitted": true
+            },
+            {
+              "id": "hvf6",
+              "name": "hvf6",
+              "isPermitted": true
+            }
+          ],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [
+              {
+                "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                "name": "USP-SIP-IC-24335-T-01",
+                "isPermitted": true
+              }
+            ],
+            "hvf6": [
+              {
+                "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "name": "AIN Web Tool-15-D-testalexandria",
+                "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-hvf6-09",
+                "isPermitted": true
+              },
+              {
+                "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                "name": "DN5242-Nov16-T3",
+                "isPermitted": true
+              }
+            ]
+          }
+        },
+        "productFamilies": [
+          {
+            "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "name": "SCOTTIE",
+            "isPermitted": true
+          },
+          {
+            "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "name": "IGNACIO",
+            "isPermitted": true
+          },
+          {
+            "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "name": "Christie",
+            "isPermitted": true
+          },
+          {
+            "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+            "name": "Enhanced Services",
+            "isPermitted": true
+          },
+          {
+            "id": "vTerrance",
+            "name": "vTerrance",
+            "isPermitted": true
+          },
+          {
+            "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+            "name": "vSCP",
+            "isPermitted": true
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": true
+          },
+          {
+            "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+            "name": "BVOIP",
+            "isPermitted": true
+          },
+          {
+            "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+            "name": "LINDSEY",
+            "isPermitted": true
+          },
+          {
+            "id": "LRSI-OSPF",
+            "name": "LRSI-OSPF",
+            "isPermitted": true
+          },
+          {
+            "id": "vRosemarie",
+            "name": "HNGATEWAY",
+            "isPermitted": true
+          },
+          {
+            "id": "vHNPaas",
+            "name": "WILKINS",
+            "isPermitted": true
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "TYLER SILVIA",
+            "isPermitted": true
+          },
+          {
+            "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+            "name": "VROUTER",
+            "isPermitted": true
+          },
+          {
+            "id": "Cisneros",
+            "name": "vMuriel",
+            "isPermitted": true
+          },
+          {
+            "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+            "name": "CARA Griffin",
+            "isPermitted": true
+          },
+          {
+            "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          },
+          {
+            "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+            "name": "Transport",
+            "isPermitted": true
+          },
+          {
+            "id": "vSalvatore",
+            "name": "vSalvatore",
+            "isPermitted": true
+          },
+          {
+            "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+            "name": "Josefina",
+            "isPermitted": true
+          },
+          {
+            "id": "vHubbard",
+            "name": "vHubbard",
+            "isPermitted": true
+          },
+          {
+            "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          }
+        ],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [
+            {
+              "id": "0",
+              "name": "vRichardson",
+              "isPermitted": false
+            },
+            {
+              "id": "1",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "2",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "3",
+              "name": "vJamie",
+              "isPermitted": false
+            },
+            {
+              "id": "4",
+              "name": "vVoiceMail",
+              "isPermitted": false
+            },
+            {
+              "id": "5",
+              "name": "Kennedy",
+              "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": "LINDSEY",
+              "isPermitted": false
+            },
+            {
+              "id": "17",
+              "name": "JOHANNA_SANTOS",
+              "isPermitted": false
+            },
+            {
+              "id": "18",
+              "name": "vCarroll",
+              "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": "WayneHolland"
+            },
+            {
+              "id": "Melissa",
+              "name": "Melissa"
+            }
+          ],
+          "projectList": [
+            {
+              "id": "WATKINS",
+              "name": "WATKINS"
+            },
+            {
+              "id": "x1",
+              "name": "x1"
+            },
+            {
+              "id": "yyy1",
+              "name": "yyy1"
+            }
+          ],
+          "lineOfBusinessList": [
+            {
+              "id": "ONAP",
+              "name": "ONAP"
+            },
+            {
+              "id": "zzz1",
+              "name": "zzz1"
+            }
+          ],
+          "platformList": [
+            {
+              "id": "platform",
+              "name": "platform"
+            },
+            {
+              "id": "xxx1",
+              "name": "xxx1"
+            }
+          ]
+        },
+        "type": "[LCP_REGIONS_AND_TENANTS] Update",
+        "subscribers": [
+          {
+            "id": "CAR_2020_ER",
+            "name": "CAR_2020_ER",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-2",
+            "name": "DALE BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-1",
+            "name": "LLOYD BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example",
+            "name": "JimmyExampleCust-20161102",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example2",
+            "name": "JimmyExampleCust-20161103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-102",
+            "name": "ERICA5779-TestSub-PWT-102",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-101",
+            "name": "ERICA5779-TestSub-PWT-101",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-4",
+            "name": "ERICA5779-Subscriber-5",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-103",
+            "name": "ERICA5779-TestSub-PWT-103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-2",
+            "name": "ERICA5779-Subscriber-2",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": true
+          },
+          {
+            "id": "ERICA5779-Subscriber-3",
+            "name": "ERICA5779-Subscriber-3",
+            "isPermitted": false
+          },
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          }
+        ]
+      }
+    }
+  }
+}
+
+class MockFeatureFlagsService {}
+
+describe('VNF Control Generator', () => {
+  let injector;
+  let service: VnfControlGenerator;
+  let httpMock: HttpTestingController;
+
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [VnfControlGenerator,
+        GenericFormService,
+        BasicControlGenerator,
+        AaiService,
+        FormBuilder,
+        LogService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+    await TestBed.compileComponents();
+
+
+    injector = getTestBed();
+    service = injector.get(VnfControlGenerator);
+    httpMock = injector.get(HttpTestingController);
+
+  })().then(done).catch(done.fail));
+
+
+  test('getMacroFormControls check for mandatory controls', () => {
+    const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const vnfName : string = "VF_vMee 0";
+    const vnfStoreKey : string = "VF_vMee 0";
+    const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfName, []);
+
+    const mandatoryControls : string[] = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.LCPCLOUD_REGION_ID,
+      FormControlNames.TENANT_ID,
+      'platformName'
+    ];
+
+    for(let i = 0 ; i < mandatoryControls.length ; i++){
+      let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+      expect(requiredExist).toBeDefined();
+    }
+  });
+
+  test('should provide empty array on getMacroFormControls when serviceId, vnfName and vnfStoreKey equals to null', () => {
+
+    let vnfStoreKey = null;
+    const serviceId = null;
+    const vnfName : string = null;
+    const result:FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfName, []);
+    expect(result).toEqual([]);
+  });
+
+  test('should provide empty array on getAlaCarteFormControls when serviceId, vnfName and vnfStoreKey equals to null', () => {
+    let vnfStoreKey = null;
+    const serviceId = null;
+    const vnfName : string = null;
+    const result:FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vnfName, []);
+    expect(result).toEqual([]);
+  });
+
+  function getALaCarteFormControls(vnfStoreKey: string): FormControlModel[] {
+    const serviceId: string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const vnfName: string = "VF_vMee 0";
+    const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfStoreKey, vnfName, []);
+    return controls;
+  }
+
+  test('getMacroFormControls should return the correct order of controls', () => {
+    const serviceId : string = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    const vnfName : string = "VF_vMee 0";
+    const vnfStoreKey : string = null;
+    const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfStoreKey, vnfName, []);
+
+    const controlsOrderNames = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.PRODUCT_FAMILY_ID,
+      FormControlNames.LCPCLOUD_REGION_ID ,
+      'legacyRegion',
+      'tenantId',
+      'platformName',
+      'lineOfBusiness'];
+
+    expect(controls.length).toEqual(7);
+    for(let i = 0 ; i < controls.length ; i++){
+      expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+    }
+  });
+
+  test('getAlacartFormControls should return the correct order of controls', () => {
+    const controls = getALaCarteFormControls(null);
+
+    const controlsOrderNames = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.PRODUCT_FAMILY_ID,
+      FormControlNames.LCPCLOUD_REGION_ID,
+      'legacyRegion',
+      'tenantId',
+      'platformName',
+      'lineOfBusiness',
+      'rollbackOnFailure'];
+    expect(controls.length).toEqual(8);
+    for(let i = 0 ; i < controls.length ; i++) {
+      expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+    }
+  });
+
+
+  test('getAlacartFormControls check for mandatory controls', () => {
+    const controls = getALaCarteFormControls("VF_vMee 0");
+    const mandatoryControls : string[] = [
+      FormControlNames.INSTANCE_NAME,
+      FormControlNames.LCPCLOUD_REGION_ID,
+      'tenantId',
+      'platformName',
+      'rollbackOnFailure'
+    ];
+    for(let i = 0 ; i < mandatoryControls.length ; i++){
+      let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+      expect(requiredExist).toBeDefined();
+    }
+  });
+
+  test('getAlacartFormControls instance name control validator shall have the expected regex', () => {
+    const controls:FormControlModel[] = getALaCarteFormControls("VF_vMee 0");
+
+    const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME);
+    const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern);
+    expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/);
+  });
+
+  test('rollback should return observable of true, false', () => {
+    let result : Observable<SelectOption[]> = service.getRollBackOnFailureOptions();
+    result.subscribe((val)=>{
+      expect(val).toEqual([
+        new SelectOption({id: 'true', name: 'Rollback'}),
+        new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+      ]);
+    });
+  });
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.ts
new file mode 100644 (file)
index 0000000..3484038
--- /dev/null
@@ -0,0 +1,243 @@
+import {Injectable} from "@angular/core";
+import {GenericFormService} from "../../generic-form.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {NgRedux} from "@angular-redux/store";
+import {HttpClient} from "@angular/common/http";
+import {BasicControlGenerator} from "../basic.control.generator";
+import {
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {VNFModel} from "../../../../models/vnfModel";
+import {AppState} from "../../../../store/reducers";
+import {FormGroup} from "@angular/forms";
+import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model";
+import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum";
+import {InputFormControl} from "../../../../models/formControlModels/inputFormControl.model";
+import {Observable, of} from "rxjs";
+import {SelectOption} from "../../../../models/selectOption";
+import * as _ from 'lodash';
+import {Constants} from "../../../../utils/constants";
+
+export enum FormControlNames {
+  INSTANCE_NAME = 'instanceName',
+  GLOBAL_SUBSCRIBER_ID = 'globalSubscriberId',
+  SUBSCRIPTION_SERVICE_TYPE = 'subscriptionServiceType',
+  PRODUCT_FAMILY_ID = 'productFamilyId',
+  LCPCLOUD_REGION_ID = 'lcpCloudRegionId',
+  TENANT_ID = 'tenantId',
+  AICZONE_ID = 'aicZoneId',
+  PROJECT_NAME = 'projectName',
+  OWNING_ENTITY_ID = 'owningEntityId',
+  ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
+  PAUSE = 'pause'
+}
+
+enum InputType {
+  LCP_REGION = "lcpCloudRegionId",
+  TENANT = "tenantId",
+  LOB = "lineOfBusiness",
+  PLATFORM = "platformName",
+  ROLLBACK = "rollbackOnFailure",
+  PRODUCT_FAMILY = "productFamilyId",
+  VG = "volumeGroupName"
+}
+
+@Injectable()
+export class VnfControlGenerator {
+  aaiService: AaiService;
+  constructor(private genericFormService: GenericFormService,
+              private _basicControlGenerator: BasicControlGenerator,
+              private store: NgRedux<AppState>,
+              private http: HttpClient,
+              private _aaiService: AaiService,
+              private _logService: LogService) {
+    this.aaiService = _aaiService;
+  }
+
+  getVnfInstance = (serviceId: string, vnfStoreKey: string): any => {
+    let vnfInstance = null;
+    if (this.store.getState().service.serviceInstance[serviceId] && _.has(this.store.getState().service.serviceInstance[serviceId].vnfs, vnfStoreKey)) {
+      vnfInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey]);
+    }
+    return vnfInstance;
+  };
+
+  getMacroFormControls(serviceId: string, vnfStoreKey: string, vnfName: string, dynamicInputs?: any[]): FormControlModel[] {
+    vnfStoreKey = _.isNil(vnfStoreKey) ? vnfName : vnfStoreKey;
+
+    if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vnfName)) {
+      this._logService.error('should provide serviceId, vnfName, vnfStoreKey', serviceId);
+      return [];
+    }
+
+    const vnfInstance = this.getVnfInstance(serviceId, vnfStoreKey);
+    const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfName]);
+    let result: FormControlModel[] = [];
+
+    if (!_.isNil(vnfModel)) {
+      result.push(this.getInstanceName(vnfInstance, serviceId, vnfName, vnfModel.isEcompGeneratedNaming));
+      result.push(this._basicControlGenerator.getProductFamilyControl(vnfInstance, result, false));
+      result.push(this.getLcpRegionControl(serviceId, vnfInstance, result));
+      result.push(this._basicControlGenerator.getLegacyRegion(vnfInstance));
+      result.push(this.getTenantControl(serviceId, vnfInstance, result));
+      result.push(this.getPlatformControl(vnfInstance, result));
+      result.push(this.getLineOfBusinessControl(vnfInstance, result));
+    }
+    return result;
+  }
+
+  getAlaCarteFormControls(serviceId: string, vnfStoreKey: string, vnfName: string, dynamicInputs?: any[]): FormControlModel[] {
+    vnfStoreKey = _.isNil(vnfStoreKey) ? vnfName : vnfStoreKey;
+    if (_.isNil(serviceId) || _.isNil(vnfStoreKey) || _.isNil(vnfName)) {
+      this._logService.error('should provide serviceId, vnfName, vnfStoreKey', serviceId);
+      return [];
+    }
+
+    let result: FormControlModel[] = [];
+    const vnfInstance = this.getVnfInstance(serviceId, vnfStoreKey);
+    const vnfModel = new VNFModel(this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfName]);
+
+    if (!_.isNil(vnfModel)) {
+      result.push(this.getInstanceName(vnfInstance, serviceId, vnfName, vnfModel.isEcompGeneratedNaming));
+      result.push(this._basicControlGenerator.getProductFamilyControl(vnfInstance, result, false));
+      result.push(this.getLcpRegionControl(serviceId, vnfInstance, result));
+      result.push(this._basicControlGenerator.getLegacyRegion(vnfInstance));
+      result.push(this.getTenantControl(serviceId, vnfInstance, result));
+      result.push(this.getPlatformControl(vnfInstance, result));
+      result.push(this.getLineOfBusinessControl(vnfInstance, result));
+      result.push(this.getRollbackOnFailureControl(vnfInstance, result));
+    }
+    return result;
+  }
+
+  isInputShouldBeShown = (inputType: any): boolean => {
+    let vnfInputs = [InputType.LCP_REGION, InputType.LOB, InputType.TENANT, InputType.PRODUCT_FAMILY, InputType.PLATFORM, InputType.ROLLBACK];
+    return vnfInputs.indexOf(inputType) > -1;
+  };
+
+  getInstanceName(instance : any, serviceId : string, vnfName : string, isEcompGeneratedNaming: boolean): FormControlModel {
+    const vnfModel : VNFModel = this.store.getState().service.serviceHierarchy[serviceId].vnfs[vnfName];
+    return this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, vnfModel);
+  }
+
+  getLineOfBusinessControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: 'lineOfBusiness',
+      displayName: 'Line of business',
+      dataTestId: 'lineOfBusiness',
+      placeHolder: 'Select Line Of Business',
+      isDisabled: false,
+      name: "lineOfBusiness",
+      value: instance ? instance.lineOfBusiness : null,
+      validations: [],
+      onInitSelectedField: ['lineOfBusinessList'],
+      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+    })
+  };
+
+  getPlatformControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: 'platformName',
+      displayName: 'Platform',
+      dataTestId: 'platform',
+      placeHolder: 'Select Platform',
+      isDisabled: false,
+      name: "platform",
+      value: instance ? instance.platformName : null,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInitSelectedField: ['platformList'],
+      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this._aaiService.getCategoryParameters)
+    })
+  };
+
+  getTenantControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    const service = this.store.getState().service.serviceInstance[serviceId];
+    const globalCustomerId: string = service.globalSubscriberId;
+    const serviceType: string = service.subscriptionServiceType;
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: FormControlNames.TENANT_ID,
+      displayName: 'Tenant',
+      dataTestId: 'tenant',
+      placeHolder: 'Select Tenant',
+      name: "tenant",
+      isDisabled: _.isNil(instance) || _.isNil(instance.lcpCloudRegionId),
+      onInitSelectedField: instance ? ['lcpRegionsTenantsMap', instance.lcpCloudRegionId] : null,
+      value: instance ? instance.tenantId : null,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInit : instance ? this._basicControlGenerator.getSubscribeInitResult.bind(
+        this._aaiService,
+        this.aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)) : ()=>{},
+    })
+  };
+
+  getLcpRegionControl = (serviceId: string, instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    const service = this.store.getState().service.serviceInstance[serviceId];
+    const globalCustomerId: string = service.globalSubscriberId;
+    const serviceType: string = service.subscriptionServiceType;
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: 'lcpCloudRegionId',
+      displayName: 'LCP region',
+      dataTestId: 'lcpRegion',
+      placeHolder: 'Select LCP Region',
+      name: "lcpRegion",
+      isDisabled: false,
+      value: instance ? instance.lcpCloudRegionId : null,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      onInitSelectedField: ['lcpRegionList'],
+      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(
+        this._aaiService,
+        this._aaiService.getLcpRegionsAndTenants.bind(this, globalCustomerId, serviceType)),
+      onChange: (param: string, form: FormGroup) => {
+        form.controls[FormControlNames.TENANT_ID].enable();
+        form.controls[FormControlNames.TENANT_ID].reset();
+        if (!_.isNil(globalCustomerId) && !_.isNil(serviceType)) {
+          this._basicControlGenerator.getSubscribeResult.bind(this, this._aaiService.getLcpRegionsAndTenants(globalCustomerId, serviceType).subscribe(res => {
+            controls.find(item => item.controlName === FormControlNames.TENANT_ID)['options$'] = res.lcpRegionsTenantsMap[param];
+            if(res.lcpRegionsTenantsMap[param]){
+              controls.find(item => item.controlName === FormControlNames.TENANT_ID)['hasEmptyOptions'] = res.lcpRegionsTenantsMap[param].length === 0;
+            }
+          }));
+        }
+
+        if (Constants.LegacyRegion.MEGA_REGION.indexOf(param) !== -1) {
+          form.controls['legacyRegion'].enable();
+          controls.find(item => item.controlName === 'legacyRegion').isVisible = true;
+
+        } else {
+          controls.find(item => item.controlName === 'legacyRegion').isVisible = false;
+          form.controls['legacyRegion'].setValue(null);
+          form.controls['legacyRegion'].reset();
+          form.controls['legacyRegion'].disable();
+        }
+      }
+    })
+  };
+
+  getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: FormControlNames.ROLLBACK_ON_FAILURE,
+      displayName: 'Rollback on failure',
+      dataTestId: 'rollback',
+      placeHolder: 'Rollback on failure',
+      isDisabled: false,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      value: instance ? instance.rollbackOnFailure : 'true',
+      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions)
+    })
+  };
+
+  getRollBackOnFailureOptions = (): Observable<SelectOption[]> => {
+    return of([
+      new SelectOption({id: 'true', name: 'Rollback'}),
+      new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+    ]);
+  };
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.spec.ts
new file mode 100644 (file)
index 0000000..6dcaa82
--- /dev/null
@@ -0,0 +1,364 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from '@angular-redux/store';
+import {FormControlNames} from "../service.control.generator";
+import {BasicControlGenerator} from "../basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {GenericFormService} from "../../generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {VnfGroupControlGenerator} from "./vnfGroup.control.generator";
+import {Observable} from "rxjs";
+import {SelectOption} from "../../../../models/selectOption";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T> {
+  getState(){
+    return {
+      "global": {
+        "name": null,
+        "type": "UPDATE_DRAWING_BOARD_STATUS",
+        "drawingBoardStatus": "CREATE",
+        "flags": {
+          "CREATE_INSTANCE_TEST": false,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "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,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_DEFAULT_VNF": true,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
+          "FLAG_A_LA_CARTE_AUDIT_INFO": true,
+          "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": true,
+          "FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS": true,
+          "FLAG_1810_CR_SOFT_DELETE_ALACARTE_VF_MODULE": true,
+          "FLAG_1902_NEW_VIEW_EDIT": true
+        }
+      },
+      "service": {
+        "serviceHierarchy": {
+          "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc": {
+            "service": {
+              "vidNotions": {
+                "instantiationUI": "serviceWithVnfGrouping",
+                "modelCategory": "other",
+                "viewEditUI": "serviceWithVnfGrouping"
+              },
+              "uuid": "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc",
+              "invariantUuid": "7ee41ce4-4827-44b0-a48e-2707a59905d2",
+              "name": "Grouping Service for Test",
+              "version": "1.0",
+              "toscaModelURL": null,
+              "category": "Network L4+",
+              "serviceType": "INFRASTRUCTURE",
+              "serviceRole": "GROUPING",
+              "description": "xxx",
+              "serviceEcompNaming": "false",
+              "instantiationType": "A-La-Carte",
+              "inputs": {}
+            },
+            "vnfs": {},
+            "networks": {},
+            "collectionResource": {},
+            "configurations": {},
+            "fabricConfigurations": {},
+            "serviceProxies": {
+              "vdbe_svc_vprs_proxy 0": {
+                "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+                "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+                "description": "A Proxy for Service vDBE_Svc_vPRS",
+                "name": "vDBE_Svc_vPRS Service Proxy",
+                "version": "1.0",
+                "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9",
+                "inputs": {},
+                "commands": {},
+                "properties": {},
+                "type": "Service Proxy",
+                "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274",
+                "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14",
+                "sourceModelName": "vDBE_Svc_vPRS"
+              },
+              "tsbc0001vm001_svc_proxy 0": {
+                "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+                "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+                "description": "A Proxy for Service tsbc0001vm001_Svc",
+                "name": "tsbc0001vm001_Svc Service Proxy",
+                "version": "1.0",
+                "customizationUuid": "3d814462-30fb-4c62-b997-9aa360d27ead",
+                "inputs": {},
+                "commands": {},
+                "properties": {},
+                "type": "Service Proxy",
+                "sourceModelUuid": "28aeb8f6-5620-4148-8bfb-a5fb406f0309",
+                "sourceModelInvariant": "c989ab9a-33c7-46ec-b521-1b2daef5f047",
+                "sourceModelName": "tsbc0001vm001_Svc"
+              }
+            },
+            "vfModules": {},
+            "volumeGroups": {},
+            "pnfs": {},
+            "vnfGroups": {
+              "groupingservicefortest..ResourceInstanceGroup..0": {
+                "type": "VnfGroup",
+                "invariantUuid": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
+                "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48",
+                "version": "1",
+                "name": "groupingservicefortest..ResourceInstanceGroup..0",
+                "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
+                "properties": {
+                  "ecomp_generated_naming": "false",
+                  "contained_resource_type": "VF",
+                  "role": "SERVICE-ACCESS",
+                  "function": "DATA",
+                  "description": "DDD0",
+                  "type": "LOAD-GROUP"
+                },
+                "members": {
+                  "vdbe_svc_vprs_proxy 0": {
+                    "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+                    "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+                    "description": "A Proxy for Service vDBE_Svc_vPRS",
+                    "name": "vDBE_Svc_vPRS Service Proxy",
+                    "version": "1.0",
+                    "customizationUuid": "bdb63d23-e132-4ce7-af2c-a493b4cafac9",
+                    "inputs": {},
+                    "commands": {},
+                    "properties": {},
+                    "type": "Service Proxy",
+                    "sourceModelUuid": "da7827a2-366d-4be6-8c68-a69153c61274",
+                    "sourceModelInvariant": "24632e6b-584b-4f45-80d4-fefd75fd9f14",
+                    "sourceModelName": "vDBE_Svc_vPRS"
+                  }
+                }
+              },
+              "groupingservicefortest..ResourceInstanceGroup..1": {
+                "type": "VnfGroup",
+                "invariantUuid": "a704112d-dbc6-4e56-8d4e-aec57e95ef9a",
+                "uuid": "c2b300e6-45de-4e5e-abda-3032bee2de56",
+                "version": "1",
+                "name": "groupingservicefortest..ResourceInstanceGroup..1",
+                "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..1",
+                "properties": {
+                  "ecomp_generated_naming": "true",
+                  "contained_resource_type": "VF",
+                  "role": "SERVICE-ACCESS",
+                  "function": "SIGNALING",
+                  "description": "DDD1",
+                  "type": "LOAD-GROUP"
+                },
+                "members": {
+                  "tsbc0001vm001_svc_proxy 0": {
+                    "uuid": "65fadfa8-a0d9-443f-95ad-836cd044e26c",
+                    "invariantUuid": "f4baae0c-b3a5-4ca1-a777-afbffe7010bc",
+                    "description": "A Proxy for Service tsbc0001vm001_Svc",
+                    "name": "tsbc0001vm001_Svc Service Proxy",
+                    "version": "1.0",
+                    "customizationUuid": "3d814462-30fb-4c62-b997-9aa360d27ead",
+                    "inputs": {},
+                    "commands": {},
+                    "properties": {},
+                    "type": "Service Proxy",
+                    "sourceModelUuid": "28aeb8f6-5620-4148-8bfb-a5fb406f0309",
+                    "sourceModelInvariant": "c989ab9a-33c7-46ec-b521-1b2daef5f047",
+                    "sourceModelName": "tsbc0001vm001_Svc"
+                  }
+                }
+              }
+            }
+          }
+        },
+        "serviceInstance": {
+          "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc": {
+            "existingVNFCounterMap": {},
+            "existingVnfGroupCounterMap": {
+              "daeb6568-cef8-417f-9075-ed259ce59f48": 1,
+              "c2b300e6-45de-4e5e-abda-3032bee2de56": 0
+              },
+              "existingNetworksCounterMap": {},
+              "vnfs": {},
+              "vnfGroups": {
+                "groupingservicefortest..ResourceInstanceGroup..0": {
+                  "inMaint": false,
+                  "rollbackOnFailure": "true",
+                  "originalName": "groupingservicefortest..ResourceInstanceGroup..0",
+                  "isMissingData": false,
+                  "trackById": "johjmxpmrlk",
+                  "vnfGroupStoreKey": "groupingservicefortest..ResourceInstanceGroup..0",
+                  "instanceName": "groupingservicefortestResourceInstanceGroup0",
+                  "instanceParams": [
+                    {}
+                  ],
+                  "modelInfo": {
+                    "modelInvariantId": "4bb2e27e-ddab-4790-9c6d-1f731bc14a45",
+                    "modelVersionId": "daeb6568-cef8-417f-9075-ed259ce59f48",
+                    "modelName": "groupingservicefortest..ResourceInstanceGroup..0",
+                    "modelVersion": "1",
+                    "modelCustomizationName": "groupingservicefortest..ResourceInstanceGroup..0",
+                    "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+                  },
+                  "uuid": "daeb6568-cef8-417f-9075-ed259ce59f48"
+                }
+              },
+              "isEcompGeneratedNaming": false,
+            "existingNames": {}
+          }
+        }
+      }
+    }
+  }
+}
+
+class MockFeatureFlagsService {}
+
+describe('VNF Group Control Generator', () => {
+  let injector;
+  let service: VnfGroupControlGenerator;
+  let httpMock: HttpTestingController;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [VnfGroupControlGenerator,
+        GenericFormService,
+        BasicControlGenerator,
+        AaiService,
+        FormBuilder,
+        LogService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(VnfGroupControlGenerator);
+    httpMock = injector.get(HttpTestingController);
+
+  })().then(done).catch(done.fail));
+
+
+
+  test('getMacroFormControls check for mandatory controls', () => {
+    const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
+    const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0";
+    const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..0";
+    const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);
+
+    const mandatoryControls : string[] = [
+      FormControlNames.INSTANCE_NAME
+    ];
+
+    for(let i = 0 ; i < mandatoryControls.length ; i++){
+      let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+      expect(requiredExist).toBeDefined();
+    }
+  });
+
+  test('getMacroFormControls should return the correct order of controls', () => {
+    const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
+    const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0";
+    const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..0";
+    const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);
+
+    const controlsOrderNames = [
+      FormControlNames.INSTANCE_NAME,
+      'rollbackOnFailure'];
+
+    expect(controls.length).toEqual(1);
+    for(let i = 0 ; i < controls.length ; i++){
+      expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+    }
+  });
+
+  test('getMacroFormControls check for mandatory controls when ecomp naming = true', () => {
+    const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
+    const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..1";
+    const vnfGroupStoreKey : string = "groupingservicefortest..ResourceInstanceGroup..1";
+    const controls :FormControlModel[] = service.getMacroFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);
+
+    let isOptional = controls.find(ctrl => ctrl.controlName === 'instanceName').validations.find(item => item.validatorName !== 'required');
+    expect(isOptional).toBeTruthy();
+  });
+
+  test('getAlacartFormControls should return the correct order of controls', () => {
+    const controls:FormControlModel[] = getALaCarteFormControls();
+
+    const controlsOrderNames = [
+      FormControlNames.INSTANCE_NAME,
+      'rollbackOnFailure'];
+    expect(controls.length).toEqual(2);
+    for(let i = 0 ; i < controls.length ; i++) {
+      expect(controls[i].controlName).toEqual(controlsOrderNames[i]);
+    }
+  });
+
+
+  test('getAlacartFormControls check for mandatory controls', () => {
+    const controls:FormControlModel[] = getALaCarteFormControls();
+
+    const mandatoryControls : string[] = [
+      FormControlNames.INSTANCE_NAME,
+      'rollbackOnFailure'
+    ];
+    for(let i = 0 ; i < mandatoryControls.length ; i++){
+      let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+      expect(requiredExist).toBeDefined();
+    }
+  });
+
+  test('getAlacartFormControls with ecomp_naming true check for mandatory controls', () => {
+    const controls:FormControlModel[] = getALaCarteFormControls();
+
+    const mandatoryControls : string[] = [
+      'rollbackOnFailure'
+    ];
+    for(let i = 0 ; i < mandatoryControls.length ; i++){
+      let requiredExist = controls.find(ctrl => ctrl.controlName === mandatoryControls[i]).validations.find(item => item.validatorName === 'required');
+      expect(requiredExist).toBeDefined();
+    }
+  });
+
+  test('default instanceName', () => {
+    const serviceId : string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
+    const vnfGroupName : string = "groupingservicefortest..ResourceInstanceGroup..0";
+    let result:FormControlModel  = service.getInstanceName(null, serviceId, vnfGroupName, false);
+    expect(result.value).toEqual("groupingservicefortest..ResourceInstanceGroup..0");
+  });
+
+  test('rollbackOnFailure', () => {
+    let result : Observable<SelectOption[]> = service.getRollBackOnFailureOptions();
+    result.subscribe((val)=>{
+      expect(val).toEqual([
+        new SelectOption({id: 'true', name: 'Rollback'}),
+        new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+      ]);
+    });
+  });
+
+  test('getAlacartFormControls instance name control validator shall have the expected regex', () => {
+    const controls:FormControlModel[] = getALaCarteFormControls();
+
+    const instanceNameControl: FormControlModel = <FormControlModel>controls.find(item => item.controlName === FormControlNames.INSTANCE_NAME);
+    const instanceNameValidator: ValidatorModel = instanceNameControl.validations.find(val => val.validatorName === ValidatorOptions.pattern);
+    expect(instanceNameValidator.validatorArg).toEqual(/^[a-zA-Z0-9._-]*$/);
+  });
+
+  function getALaCarteFormControls():FormControlModel[] {
+    const serviceId: string = "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc";
+    const vnfGroupName: string = "groupingservicefortest..ResourceInstanceGroup..0";
+    const vnfGroupStoreKey: string = "groupingservicefortest..ResourceInstanceGroup..0";
+    const controls: FormControlModel[] = service.getAlaCarteFormControls(serviceId, vnfGroupStoreKey, vnfGroupName, []);
+    return controls;
+  }
+});
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.ts b/vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.ts
new file mode 100644 (file)
index 0000000..e503f4d
--- /dev/null
@@ -0,0 +1,118 @@
+import {Injectable} from "@angular/core";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {NgRedux} from "@angular-redux/store";
+import {BasicControlGenerator} from "../basic.control.generator";
+import {
+  FormControlModel,
+  ValidatorModel,
+  ValidatorOptions
+} from "../../../../models/formControlModels/formControl.model";
+import {LogService} from "../../../../utils/log/log.service";
+import {AppState} from "../../../../store/reducers";
+import {DropdownFormControl} from "../../../../models/formControlModels/dropdownFormControl.model";
+import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum";
+import {SelectOption} from "../../../../models/selectOption";
+import {VnfGroupModel} from "../../../../models/vnfGroupModel";
+import * as _ from 'lodash';
+import {Observable, of} from "rxjs";
+
+
+export enum FormControlNames {
+  INSTANCE_NAME = 'instanceName',
+  ROLLBACK_ON_FAILURE = 'rollbackOnFailure',
+}
+
+enum InputType {
+  ROLLBACK = "rollbackOnFailure"
+}
+
+@Injectable()
+export class VnfGroupControlGenerator {
+  aaiService: AaiService;
+  constructor(private _basicControlGenerator: BasicControlGenerator,
+              private store: NgRedux<AppState>,
+              private _aaiService: AaiService,
+              private _logService: LogService) {
+    this.aaiService = _aaiService;
+  }
+
+  getVnfGroupInstance = (serviceId: string, vnfGroupStoreKey: string): any => {
+    let vnfGroupInstance = null;
+    if (this.store.getState().service.serviceInstance[serviceId] && _.has(this.store.getState().service.serviceInstance[serviceId].vnfGroups, vnfGroupStoreKey)) {
+      vnfGroupInstance = Object.assign({}, this.store.getState().service.serviceInstance[serviceId].vnfGroups[vnfGroupStoreKey]);
+    }
+    return vnfGroupInstance;
+  };
+
+  getMacroFormControls(serviceId: string, vnfGroupStoreKey: string, vnfGroupName: string, dynamicInputs?: Array<any>): Array<FormControlModel> {
+    vnfGroupStoreKey = _.isNil(vnfGroupStoreKey) ? vnfGroupName : vnfGroupStoreKey;
+
+    if (_.isNil(serviceId) || _.isNil(vnfGroupStoreKey) || _.isNil(vnfGroupName)) {
+      this._logService.error('should provide serviceId, vnfGroupName, vnfGroupStoreKey', serviceId);
+      return [];
+    }
+
+    const vnfGroupInstance = this.getVnfGroupInstance(serviceId, vnfGroupStoreKey);
+    const vnfGroupModel = new VnfGroupModel(this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName]);
+    let result: FormControlModel[] = [];
+
+    if (!_.isNil(vnfGroupModel)) {
+      result.push(this.getInstanceName(vnfGroupInstance, serviceId, vnfGroupName, vnfGroupModel.isEcompGeneratedNaming));
+    }
+    return result;
+  }
+
+  getAlaCarteFormControls(serviceId: string, vnfGroupStoreKey: string, vnfGroupName: string, dynamicInputs?: any[]): FormControlModel[] {
+    vnfGroupStoreKey = _.isNil(vnfGroupStoreKey) ? vnfGroupName : vnfGroupStoreKey;
+    if (_.isNil(serviceId) || _.isNil(vnfGroupStoreKey) || _.isNil(vnfGroupName)) {
+      this._logService.error('should provide serviceId, vnfGroupName, vnfGroupStoreKey', serviceId);
+      return [];
+    }
+
+    let result: FormControlModel[] = [];
+    const vnfGroupInstance = this.getVnfGroupInstance(serviceId, vnfGroupStoreKey);
+    const vnfGroupModel = new VnfGroupModel(this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName]);
+
+    if (!_.isNil(vnfGroupModel)) {
+      result.push(this.getInstanceName(vnfGroupInstance, serviceId, vnfGroupName, vnfGroupModel.isEcompGeneratedNaming));
+      result.push(this.getRollbackOnFailureControl(vnfGroupInstance, result));
+    }
+    return result;
+  }
+
+  isInputShouldBeShown = (inputType: any): boolean => {
+    let vnfGroupInputs = [InputType.ROLLBACK];
+    return vnfGroupInputs.indexOf(inputType) > -1;
+  };
+
+  getDefaultInstanceName(instance : any, serviceId : string, vnfGroupName : string) : string {
+    const vnfGroupModel: VnfGroupModel = this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName];
+    return this._basicControlGenerator.getDefaultInstanceName(instance, vnfGroupModel);
+  }
+
+  getInstanceName(instance : any, serviceId : string, vnfGroupName : string, isEcompGeneratedNaming: boolean): FormControlModel {
+    const vnfGroupModel : VnfGroupModel = this.store.getState().service.serviceHierarchy[serviceId].vnfGroups[vnfGroupName];
+    return this._basicControlGenerator.getInstanceNameController(instance, serviceId, isEcompGeneratedNaming, vnfGroupModel);
+  }
+
+  getRollbackOnFailureControl = (instance: any, controls: FormControlModel[]): DropdownFormControl => {
+    return new DropdownFormControl({
+      type: FormControlType.DROPDOWN,
+      controlName: FormControlNames.ROLLBACK_ON_FAILURE,
+      displayName: 'Rollback on failure',
+      dataTestId: 'rollback',
+      placeHolder: 'Rollback on failure',
+      isDisabled: false,
+      validations: [new ValidatorModel(ValidatorOptions.required, 'is required')],
+      value: instance ? instance.rollbackOnFailure : 'true',
+      onInit: this._basicControlGenerator.getSubscribeInitResult.bind(null, this.getRollBackOnFailureOptions)
+    })
+  };
+
+  getRollBackOnFailureOptions = (): Observable<SelectOption[]> => {
+    return of([
+      new SelectOption({id: 'true', name: 'Rollback'}),
+      new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+    ]);
+  };
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.html b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.html
new file mode 100644 (file)
index 0000000..d4c5118
--- /dev/null
@@ -0,0 +1,29 @@
+<div id="form-details"  *ngIf="formControls != null && dynamicFormGroup != null">
+  <form [formGroup]="dynamicFormGroup">
+    <div *ngFor="let formControl of formControls" class="form-conrtols">
+      <div [ngSwitch]="formControl.type">
+        <form-control-input  *ngSwitchCase="'INPUT'"   [data]="formControl" [form]="dynamicFormGroup"></form-control-input>
+        <checkbox-form-control *ngSwitchCase="'CHECKBOX'"  [data]="formControl" [form]="dynamicFormGroup" ></checkbox-form-control>
+        <dropdown-form-control *ngSwitchCase="'DROPDOWN'" [data]="formControl" [form]="dynamicFormGroup" ></dropdown-form-control>
+        <file-form-control *ngSwitchCase="'FILE'" [data]="formControl" [form]="dynamicFormGroup"></file-form-control>
+      </div>
+      <div  *ngIf="dynamicFormGroup != null && formControl != null && dynamicFormGroup.controls[formControl.controlName]?.errors">
+        <div *ngFor="let validatorModel of formControl?.validations">
+          <form-control-error *ngIf="validatorModel?.validatorName != 'required' && dynamicFormGroup.controls[formControl?.controlName]?.errors[validatorModel?.validatorName]" [message]="validatorModel?.errorMsg"></form-control-error>
+        </div>
+      </div>
+    </div>
+    <div *ngFor="let dynamicInputs of dynamicInputs" class="form-conrtols">
+      <div [ngSwitch]="dynamicInputs.type">
+        <form-control-input  *ngSwitchCase="'INPUT'"   [data]="dynamicInputs" [form]="dynamicFormGroup.controls['instanceParams']"></form-control-input>
+        <checkbox-form-control *ngSwitchCase="'CHECKBOX'"  [data]="dynamicInputs" [form]="dynamicFormGroup.controls['instanceParams']" ></checkbox-form-control>
+        <dropdown-form-control *ngSwitchCase="'DROPDOWN'" [data]="dynamicInputs" [form]="dynamicFormGroup.controls['instanceParams']" ></dropdown-form-control>
+      </div>
+      <div  *ngIf="dynamicFormGroup?.controls['instanceParams'] != null && dynamicInputs != null && dynamicFormGroup.controls['instanceParams'].controls[dynamicInputs.controlName]?.errors">
+        <div *ngFor="let validatorModel of dynamicInputs?.validations">
+          <form-control-error *ngIf="validatorModel?.validatorName != 'required' && dynamicFormGroup.controls['instanceParams'].controls[dynamicInputs?.controlName]?.errors[validatorModel?.validatorName]" [message]="validatorModel?.errorMsg"></form-control-error>
+        </div>
+      </div>
+    </div>
+  </form>
+</div>
@@ -1,4 +1,4 @@
-#vnf-instance-details {
+#form-details {
   position: relative;
 
   #notification-area {
     .input-text {
       border: 1px solid #D2D2D2;
       border-radius: 2px;
+      color: black;
     }
 
-    .details-item {
-      margin-bottom: 20px;
+    .form-conrtols {
+      margin-top: 20px;
+      &:first-child{
+        margin-top: 0px;
+      }
     }
   }
 
-    .checkbox-label {
-      font-family: OpenSans-Regular;
-    }
+  .checkbox-label {
+    font-family: OpenSans-Regular;
+  }
 }
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.ts b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.component.ts
new file mode 100644 (file)
index 0000000..6febd66
--- /dev/null
@@ -0,0 +1,45 @@
+import {Component, EventEmitter, Input, OnChanges, Output, SimpleChanges} from '@angular/core';
+import {GenericFormService} from "./generic-form.service";
+import {FormControlModel} from "../../models/formControlModels/formControl.model";
+import {FormGroup} from "@angular/forms";
+import * as _ from 'lodash';
+
+@Component({
+  selector : 'generic-form',
+  templateUrl : './generic-form.component.html',
+  styleUrls : ['./generic-form.component.scss']
+})
+
+export class GenericFormComponent implements OnChanges{
+  genericFormService: GenericFormService = null;
+  dynamicFormGroup: FormGroup = null;
+
+  @Input() formControls : FormControlModel[] = null;
+  @Input() dynamicInputs : FormControlModel[] = null;
+  @Input() isValidForm : boolean = false;
+  @Output() onFormChanged  = new EventEmitter();
+
+  constructor(private _genericFormService: GenericFormService){
+    this.genericFormService = _genericFormService;
+  }
+
+  ngOnChanges(changes: SimpleChanges): void {
+    if (changes["formControls"] !== undefined && changes["formControls"].currentValue !== changes["formControls"].previousValue) {
+      this.dynamicFormGroup = this._genericFormService.generateFormBuilder(this.formControls, this.dynamicInputs);
+      this.onFormChanged.next(this.dynamicFormGroup);
+      this.dynamicFormGroup.valueChanges.subscribe(() => {
+        this.onFormChanged.next(this.dynamicFormGroup);
+      })
+    }
+  }
+
+  hasApiError(controlName: string, data: any[], form: FormGroup) {
+    if (!_.isNil(data)) {
+      if (!form.controls[controlName].disabled && data.length === 0) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.spec.ts
new file mode 100644 (file)
index 0000000..7a993cf
--- /dev/null
@@ -0,0 +1,140 @@
+
+import { TestBed, getTestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {GenericFormService} from './generic-form.service';
+import {FormBuilder, FormGroup} from '@angular/forms';
+import {FormControlModel, ValidatorModel, ValidatorOptions} from "../../models/formControlModels/formControl.model";
+import {FormControlType} from "../../models/formControlModels/formControlTypes.enum";
+
+describe('Generic Form  Service', () => {
+
+  let injector;
+  let service: GenericFormService;
+  let httpMock: HttpTestingController;
+  let form : FormGroup;
+  let fb : FormBuilder;
+
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [GenericFormService, FormBuilder]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(GenericFormService);
+    httpMock = injector.get(HttpTestingController);
+    fb = injector.get(FormBuilder);
+
+  })().then(done).catch(done.fail));
+
+  let controls : FormControlModel[] = [
+    generateFormControlModel(FormControlType.INPUT, 'InputControlName','Test Value', false, generateFormValidators([ValidatorOptions.required])),
+    generateFormControlModel(FormControlType.INPUT, 'InputControlName_1', 'Test InputControlName_1', true, generateFormValidators([ValidatorOptions.required])),
+    generateFormControlModel(FormControlType.INPUT, 'InputControlName_2', 'Test InputControlName_2', false, [generateFormValidatorWithArg(ValidatorOptions.minLength, 4)]),
+    generateFormControlModel(FormControlType.INPUT, 'InputControlName_3', 'Exact 14 chars', false, [generateFormValidatorWithArg(ValidatorOptions.maxLength, 14)]),
+    generateFormControlModel(FormControlType.INPUT, 'InputControlName_4', 'Test pattern', false, [generateFormValidatorWithArg(ValidatorOptions.pattern, '^[a-zA-Z]+$')])
+  ];
+
+  describe('generateFormBuilder', ()=> {
+    test('validators should work correct', () => {
+      const controlName: string = 'InputControlName';
+      let form : FormGroup = service.generateFormBuilder(controls, []);
+
+      expect(form instanceof FormGroup).toBeTruthy();
+      expect(form.controls[controlName]).toBeDefined();
+      expect(form.controls[controlName].value).toEqual('Test Value');
+      expect(form.controls[controlName].disabled).toBeFalsy();
+      expect(form.controls[controlName].valid).toBeTruthy();
+      expect(form.controls[controlName].errors).toBeNull();
+
+      form.controls[controlName].setValue('');
+      expect(form.controls[controlName].valid).toBeFalsy();
+      expect(form.controls[controlName].errors.required).toBeTruthy();
+    });
+
+    test('validators should prevent the value to appear', () => {
+      const controlName: string = 'InputControlName_1';
+      let form : FormGroup = service.generateFormBuilder(controls, []);
+
+      expect(form instanceof FormGroup).toBeTruthy();
+      expect(form.controls[controlName]).toBeDefined();
+      expect(form.controls[controlName].disabled).toBeTruthy();
+      expect(form.controls[controlName].value).toEqual('Test InputControlName_1');
+      expect(form.controls[controlName].errors).toBeNull();
+    });
+
+    test('validators with minimum length args', () => {
+      const controlName: string = 'InputControlName_2';
+      let form : FormGroup = service.generateFormBuilder(controls, []);
+
+      expect(form instanceof FormGroup).toBeTruthy();
+      expect(form.controls[controlName]).toBeDefined();
+      expect(form.controls[controlName].disabled).toBeFalsy();
+      expect(form.controls[controlName].value).toEqual('Test InputControlName_2');
+      expect(form.controls[controlName].errors).toBeNull();
+
+      form.controls[controlName].setValue('123'); // less then 4 characters. -> error
+      expect(form.controls[controlName].errors.minlength).toBeDefined();
+      form.controls[controlName].setValue('1234');
+      expect(form.controls[controlName].errors).toBeNull();
+    });
+
+    test('validators with maximum length args', () => {
+      const controlName: string = 'InputControlName_3';
+      let form : FormGroup = service.generateFormBuilder(controls, []);
+
+      expect(form instanceof FormGroup).toBeTruthy();
+      expect(form.controls[controlName]).toBeDefined();
+      expect(form.controls[controlName].disabled).toBeFalsy();
+      expect(form.controls[controlName].value).toEqual('Exact 14 chars');
+      expect(form.controls[controlName].errors).toBeNull();
+
+      form.controls[controlName].setValue('More than max length'); // more than max characters. -> error
+      expect(form.controls[controlName].errors.maxlength).toBeDefined();
+      form.controls[controlName].setValue('Exact 14 chars');
+      expect(form.controls[controlName].errors).toBeNull();
+    });
+
+    test('pattern validator letters only', () => {
+      const controlName: string = 'InputControlName_4';
+      let form : FormGroup = service.generateFormBuilder(controls, []);
+
+
+      expect(form.controls[controlName].errors.pattern).toBeDefined();
+      form.controls[controlName].setValue('AAAAAAAA');
+      expect(form.controls[controlName].errors).toBeNull();
+    });
+  });
+
+
+
+  function generateFormValidators(validatorsNames :ValidatorOptions[]){
+    let validators : ValidatorModel[] = [];
+    for(let validatorName of validatorsNames){
+      validators.push(new ValidatorModel(validatorName, 'error ' + validatorName));
+    }
+    return validators;
+  }
+
+  function generateFormValidatorWithArg(validatorName :ValidatorOptions, arg : any){
+    return new ValidatorModel(validatorName, 'error ' + validatorName, arg);
+  }
+
+  function generateFormControlModel(type : FormControlType,
+                                    controlName: string,
+                                    value: any,
+                                    isDisabled: boolean,
+                                    validations: ValidatorModel[]){
+    let data : any = {
+      type : type,
+      isDisabled : isDisabled,
+      validations : validations,
+      value : value,
+      controlName :controlName
+    };
+
+    return new FormControlModel(data);
+  }
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.ts b/vid-webpack-master/src/app/shared/components/genericForm/generic-form.service.ts
new file mode 100644 (file)
index 0000000..15089ca
--- /dev/null
@@ -0,0 +1,54 @@
+import {Injectable} from '@angular/core';
+import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms';
+import {FormControlModel} from "../../models/formControlModels/formControl.model";
+import * as _ from 'lodash';
+
+@Injectable()
+export class GenericFormService {
+    constructor(private _formBuilder: FormBuilder){}
+
+  generateFormBuilder(controls : FormControlModel[], dynamicInputs : FormControlModel[]) : FormGroup {
+    let controlsList = {};
+    if(!_.isNil(controls)){
+      for(let control  of controls){
+        controlsList[control.controlName] =  new FormControl(
+          {
+            value: _.isNil(control.value) ? null :control.value,
+            disabled: control.isDisabled
+          }, Validators.compose(control.validations.map(item => item.validator)));
+      }
+    }
+
+    if(!_.isNil(dynamicInputs)){
+      let dynamicControlsList = {};
+      if(!_.isNil(dynamicInputs)){
+        for(let control  of dynamicInputs){
+          dynamicControlsList[control.controlName] =  new FormControl(
+            {
+              value: control.value ? control.value : null,
+              disabled: control.isDisabled
+            }, Validators.compose(control.validations.map(item => item.validator)));
+        }
+      }
+      controlsList['instanceParams'] = this._formBuilder.group(dynamicControlsList);
+    }
+
+
+    return this._formBuilder.group(controlsList);
+  }
+
+  shouldDisplayValidationError(form: FormGroup, controlName : string): boolean{
+      if(!_.isNil(form) && !_.isNil(form.controls[controlName])){
+        if(!form.controls[controlName].touched){
+          return false;
+        } else if(form.controls[controlName].disabled) {
+          return false
+        }else if(_.isNil(form.controls[controlName].errors)){
+          return false;
+        }else {
+          return true;
+        }
+      }
+      return false;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.html b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.html
new file mode 100644 (file)
index 0000000..57064f6
--- /dev/null
@@ -0,0 +1,70 @@
+<div id="instance-popup" class="modal-dialog">
+  <div class="modal-content">
+    <div class="modal-header">
+      <button type="button"
+              class="close"
+              (click)="formPopupDetails?.onCancel(formPopupDetails.that,dynamicForm)" >&times;
+      </button>
+      <span [attr.data-tests-id]="'create-modal-title'"
+            class="modal-title">{{formPopupDetails?.title}}
+      </span>
+    </div>
+    <div class="modal-body popup-content">
+
+      <div class="header-left">
+        <div>MODEL: <span>"{{formPopupDetails?.leftSubTitle}}"</span></div>
+      </div>
+
+      <div class="header-right">
+        {{formPopupDetails?.rightSubTitle}}
+      </div>
+
+
+      <label class="quantity-label" *ngIf="formPopupDetails?.UUIDData['type'] == 'service'">Qty:</label>
+      <div class="quantity" *ngIf="formPopupDetails?.UUIDData['type'] == 'service'">
+        <select [disabled]="formPopupDetails?.UUIDData['isMacro'] !== true"
+                class="quantity-select"
+                [(ngModel)]="formPopupDetails.UUIDData['bulkSize']"
+                name="quantity"
+                id="quantity-select"
+                required>
+          <option *ngFor="let qty of quantityOptions" [value]="qty">{{qty}}</option>
+        </select>
+      </div>
+
+      <div class="model-information">
+        <model-information [modelInformationItems]="formPopupDetails?.modelInformationItems"></model-information>
+      </div>
+
+      <div  class="instance-form">
+        <div style="position: relative;height: 100%;overflow: auto;">
+          <label id="notification-area"  *ngIf="shouldShowNotification() == true" style="color: #959595;font-size: 12px;left: 30px;margin-left: 30px;">Data entered will apply to all service instances</label>
+          <generic-form  [formControls]="formPopupDetails?.formControlList"
+                         [dynamicInputs]="formPopupDetails?.dynamicInputsControlList"
+                         (onFormChanged)="dynamicForm = $event" ></generic-form>
+        </div>
+      </div>
+
+    </div>
+    <div class="modal-footer row" style="padding: 0">
+      <div class="col-md-6">
+        <div *ngIf="hasSomeError(formPopupDetails, dynamicForm) == true">
+          <form-general-error [message]="errorMsg"></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)="formPopupDetails.onCancel(formPopupDetails.that, dynamicForm)"><span>Cancel</span></button>
+
+        <input type="submit"
+               value="Set"
+               data-tests-id="form-set"
+               class="btn btn-success submit"
+               [disabled]="!dynamicForm?.valid"
+               (click)="formPopupDetails.onSubmit(formPopupDetails.that, dynamicForm, servicesQty)">
+      </div>
+    </div>
+  </div>
+</div>
@@ -37,54 +37,51 @@ $grid-border: 1px #d2d2d2 solid;
     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;
+    }
   }
 
-  .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;
-
+    border-top: $grid-border;
     padding: 30px;
     overflow: auto;
     @extend .left-panel;
   }
 
   .instance-form {
+    border-top: $grid-border;
     grid-area: instance-form;
   }
 
@@ -93,7 +90,7 @@ $grid-border: 1px #d2d2d2 solid;
     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"
+      "header-left header-right quantity-label quantity"
       "model-information instance-form instance-form instance-form";
     padding: 0;
   }
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.component.ts
new file mode 100644 (file)
index 0000000..2b6417e
--- /dev/null
@@ -0,0 +1,145 @@
+import {Component, OnChanges, OnDestroy, OnInit} from '@angular/core';
+import {FormPopupDetails} from "../../models/formControlModels/formPopupDetails.model";
+import {DialogComponent, DialogService} from "ng2-bootstrap-modal";
+import {FormGroup} from "@angular/forms";
+import {IframeService} from "../../utils/iframe.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import * as _ from "lodash";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {ServicePopupService} from "./genericFormServices/service/service.popup.service";
+import {ActivatedRoute} from "@angular/router";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {GenericFormPopupService} from "./generic-form-popup.service";
+import {FormControlModel} from "../../models/formControlModels/formControl.model";
+import {FormGeneralErrorsService} from "../formGeneralErrors/formGeneralErrors.service";
+
+
+export interface PopupModel {
+  type : PopupType;
+  uuidData : UUIDData;
+  node : ITreeNode;
+  isUpdateMode : boolean;
+}
+
+export enum PopupType{
+  SERVICE = 'service',
+  VNF = 'vnf',
+  NETWORK = 'network',
+  VF_MODULE = 'vf_module',
+  VNF_GROUP = 'vnf_group'
+}
+
+
+@Component({
+  selector : 'generic-form-popup',
+  templateUrl : 'generic-form-popup.component.html',
+  styleUrls : ['generic-form-popup.component.scss']
+})
+
+export class GenericFormPopupComponent extends DialogComponent<PopupModel, boolean> implements OnInit, OnDestroy{
+  formPopupDetails : FormPopupDetails = null;
+  dynamicForm : FormGroup;
+  type : PopupType;
+  uuidData : UUIDData;
+  isUpdateMode : boolean;
+  node : ITreeNode = null;
+  hasGeneralApiError : boolean = false;
+  parentElementClassName = 'content';
+  errorMsg = 'Page contains errors. Please see details next to the relevant fields.';
+
+  servicesQty = 1;
+  quantityOptions = _.range(1, 51)
+  constructor(dialogService:  DialogService ,
+              private _iframeService : IframeService,
+              private _store: NgRedux<AppState>,
+              private _servicePopupService : ServicePopupService,
+              private _activatedRoute : ActivatedRoute,
+              private _aaiService : AaiService,
+              private _route: ActivatedRoute,
+              private _genericFormPopupService : GenericFormPopupService){
+    super(dialogService);
+  }
+
+  closeDialog(that) : void{
+    this._iframeService.removeClassCloseModal(that.parentElementClassName);
+    this.dialogService.removeDialog(this);
+    setTimeout(() => {
+      window.parent.postMessage("closeIframe", "*");
+    }, 15);
+  }
+
+  shouldShowNotification() : boolean {
+    return this.formPopupDetails && this.formPopupDetails.UUIDData['bulkSize'] > 1
+  }
+
+  ngOnInit(): void {
+    this._route
+      .queryParams
+      .subscribe(params => {
+        console.log('changed');
+        if(params['serviceModelId'] && params['isCreate']=="true"){
+          this._genericFormPopupService.initReduxOnCreateNewService().then((serviceModelId : string)=>{
+            this.uuidData = <any>{
+              bulkSize : 1,
+              isMacro : this._store.getState().service.serviceHierarchy[serviceModelId].service.instantiationType === 'Macro',
+              type : PopupType.SERVICE,
+              serviceId: serviceModelId,
+              popupService: this._servicePopupService,
+            };
+
+            this.uuidData.popupService.closeDialogEvent.subscribe((that)=>{
+              this.closeDialog(that);
+            });
+
+            this.formPopupDetails = this.uuidData.popupService.getGenericFormPopupDetails(
+              this.uuidData['serviceId'],
+              null,
+              null,
+              this.node,
+              this.uuidData,
+              false
+            );
+          });
+        }
+      });
+
+    FormGeneralErrorsService.checkForErrorTrigger.subscribe(()=>{
+      this.hasSomeError(this.formPopupDetails, this.dynamicForm);
+    });
+    
+    if(!_.isNil(this.uuidData)){
+      this.uuidData.popupService.closeDialogEvent.subscribe((that)=>{
+        this.closeDialog(that);
+      });
+
+      this.uuidData['isMacro'] = this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].service.instantiationType === 'Macro';
+      this.formPopupDetails = this._genericFormPopupService.getGenericFormDetails(this.uuidData, this.node, this.isUpdateMode);
+    }
+  }
+
+  hasSomeError(formPopupDetails : FormPopupDetails, form : FormGroup) : boolean{
+    if(_.isNil(formPopupDetails)) return false;
+    else {
+      for(let controlName in form.controls){
+        if(form.controls[controlName].errors){
+          let error: string[] = Object.keys(form.controls[controlName].errors);
+          if(error.length === 1 && error[0] === 'required'){
+            continue;
+          }else if(Object.keys(form.controls[controlName].errors).length > 0  ){
+            return true;
+          }
+        }
+      }
+    }
+
+    return formPopupDetails.formControlList.filter((item : FormControlModel) =>item.type === 'DROPDOWN' && item['hasEmptyOptions']).length > 0
+  }
+}
+
+
+export class UUIDData extends Object{
+  type : string;
+  popupService : any;
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts
new file mode 100644 (file)
index 0000000..02e5455
--- /dev/null
@@ -0,0 +1,1938 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {FormBuilder, FormGroup} from '@angular/forms';
+import {GenericFormPopupService} from "./generic-form-popup.service";
+import {IframeService} from "../../utils/iframe.service";
+import {NgRedux} from "@angular-redux/store";
+import {ServicePopupService} from "./genericFormServices/service/service.popup.service";
+import {BasicControlGenerator} from "../genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {ServiceControlGenerator} from "../genericForm/formControlsServices/service.control.generator";
+import {GenericFormService} from "../genericForm/generic-form.service";
+import {LogService} from "../../utils/log/log.service";
+import {DefaultDataGeneratorService} from "../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicPopupService} from "./genericFormServices/basic.popup.service";
+import {ActivatedRoute} from "@angular/router";
+import {UUIDData} from "./generic-form-popup.component";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {NetworkPopupService} from "./genericFormServices/network/network.popup.service";
+import {NetworkControlGenerator} from "../genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {VfModulePopuopService} from "./genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModuleControlGenerator} from "../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service";
+
+class MockAppStore<T>{
+  getState() {
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": "Emanuel",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "ComplexService",
+              "serviceEcompNaming": "false",
+              "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": {},
+                "serviceEcompNaming" : "true",
+                "properties": {
+                  "ecomp_generated_naming": "false",
+                  "max_instances": 10,
+                  "min_instances": 1,
+                  "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "true",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": true
+                  },
+                  "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": {
+                  "ecomp_generated_naming": "false",
+                  "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": true
+              },
+              "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": {}
+          }
+        },
+        "serviceInstance": {
+          "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+            "networks": {},
+            "vnfs": {
+              "VF_vMee 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "vf_vmee0..VfVmee..base_vmme..module-0": {
+                    "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+                      "isMissingData": false,
+                      "sdncPreReload": null,
+                      "modelInfo": {
+                        "modelType": "VFmodule",
+                        "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+                        "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+                        "modelName": "VfVmee..base_vmme..module-0",
+                        "modelVersion": "2",
+                        "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                        "modelCustomizationName": "VfVmee..base_vmme..module-0"
+                      },
+                      "instanceParams": [
+                        {}
+                      ],
+                      "trackById": "wmtm6sy2uj"
+                    }
+                  }
+                },
+                "isMissingData": true,
+                "originalName": "VF_vMee 0",
+                "vnfStoreKey": "VF_vMee 0",
+                "trackById": "p3wk448m5do",
+                "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+                "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+                "lcpCloudRegionId": null,
+                "tenantId": null,
+                "lineOfBusiness": null,
+                "platformName": null,
+                "modelInfo": {
+                  "modelType": "VF",
+                  "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+                  "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+                  "modelName": "VF_vMee",
+                  "modelVersion": "2.0",
+                  "modelCustomizationName": "VF_vMee 0"
+                }
+              }
+            },
+            "instanceParams": [
+              {}
+            ],
+            "validationCounter": 1,
+            "existingNames": {},
+            "existingVNFCounterMap": {
+              "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+            },
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "lcpCloudRegionId": "hvf6",
+            "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "aicZoneId": "JAG1",
+            "projectName": "x1",
+            "rollbackOnFailure": "true",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "modelName": "ComplexService",
+              "modelVersion": "1.0",
+              "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+            },
+            "isALaCarte": false,
+            "name": "ComplexService",
+            "version": "1.0",
+            "description": "ComplexService",
+            "category": "Emanuel",
+            "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isEcompGeneratedNaming": true,
+            "isMultiStepDesign": false
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [
+            {
+              "id": "JANET25",
+              "name": "JANET25",
+              "isPermitted": true
+            },
+            {
+              "id": "hvf6",
+              "name": "hvf6",
+              "isPermitted": true
+            }
+          ],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [
+              {
+                "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                "name": "USP-SIP-IC-24335-T-01",
+                "isPermitted": true
+              }
+            ],
+            "hvf6": [
+              {
+                "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "name": "AIN Web Tool-15-D-testalexandria",
+                "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-hvf6-09",
+                "isPermitted": true
+              },
+              {
+                "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                "name": "DN5242-Nov16-T3",
+                "isPermitted": true
+              }
+            ]
+          }
+        },
+        "productFamilies": [
+          {
+            "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "name": "SCOTTIE",
+            "isPermitted": true
+          },
+          {
+            "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "name": "IGNACIO",
+            "isPermitted": true
+          },
+          {
+            "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "name": "Christie",
+            "isPermitted": true
+          },
+          {
+            "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+            "name": "Enhanced Services",
+            "isPermitted": true
+          },
+          {
+            "id": "vTerrance",
+            "name": "vTerrance",
+            "isPermitted": true
+          },
+          {
+            "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+            "name": "vSCP",
+            "isPermitted": true
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": true
+          },
+          {
+            "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+            "name": "BVOIP",
+            "isPermitted": true
+          },
+          {
+            "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+            "name": "LINDSEY",
+            "isPermitted": true
+          },
+          {
+            "id": "LRSI-OSPF",
+            "name": "LRSI-OSPF",
+            "isPermitted": true
+          },
+          {
+            "id": "vRosemarie",
+            "name": "HNGATEWAY",
+            "isPermitted": true
+          },
+          {
+            "id": "vHNPaas",
+            "name": "WILKINS",
+            "isPermitted": true
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "TYLER SILVIA",
+            "isPermitted": true
+          },
+          {
+            "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+            "name": "VROUTER",
+            "isPermitted": true
+          },
+          {
+            "id": "Cisneros",
+            "name": "vMuriel",
+            "isPermitted": true
+          },
+          {
+            "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+            "name": "CARA Griffin",
+            "isPermitted": true
+          },
+          {
+            "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          },
+          {
+            "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+            "name": "Transport",
+            "isPermitted": true
+          },
+          {
+            "id": "vSalvatore",
+            "name": "vSalvatore",
+            "isPermitted": true
+          },
+          {
+            "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+            "name": "Josefina",
+            "isPermitted": true
+          },
+          {
+            "id": "vHubbard",
+            "name": "vHubbard",
+            "isPermitted": true
+          },
+          {
+            "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          }
+        ],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [
+            {
+              "id": "0",
+              "name": "vRichardson",
+              "isPermitted": false
+            },
+            {
+              "id": "1",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "2",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "3",
+              "name": "vJamie",
+              "isPermitted": false
+            },
+            {
+              "id": "4",
+              "name": "vVoiceMail",
+              "isPermitted": false
+            },
+            {
+              "id": "5",
+              "name": "Kennedy",
+              "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": "LINDSEY",
+              "isPermitted": false
+            },
+            {
+              "id": "17",
+              "name": "JOHANNA_SANTOS",
+              "isPermitted": false
+            },
+            {
+              "id": "18",
+              "name": "vCarroll",
+              "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": "WayneHolland"
+            },
+            {
+              "id": "Melissa",
+              "name": "Melissa"
+            }
+          ],
+          "projectList": [
+            {
+              "id": "WATKINS",
+              "name": "WATKINS"
+            },
+            {
+              "id": "x1",
+              "name": "x1"
+            },
+            {
+              "id": "yyy1",
+              "name": "yyy1"
+            }
+          ],
+          "lineOfBusinessList": [
+            {
+              "id": "ONAP",
+              "name": "ONAP"
+            },
+            {
+              "id": "zzz1",
+              "name": "zzz1"
+            }
+          ],
+          "platformList": [
+            {
+              "id": "platform",
+              "name": "platform"
+            },
+            {
+              "id": "xxx1",
+              "name": "xxx1"
+            }
+          ]
+        },
+        "type": "[LCP_REGIONS_AND_TENANTS] Update",
+        "subscribers": [
+          {
+            "id": "CAR_2020_ER",
+            "name": "CAR_2020_ER",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-2",
+            "name": "DALE BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-1",
+            "name": "LLOYD BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example",
+            "name": "JimmyExampleCust-20161102",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example2",
+            "name": "JimmyExampleCust-20161103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-102",
+            "name": "ERICA5779-TestSub-PWT-102",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-101",
+            "name": "ERICA5779-TestSub-PWT-101",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-4",
+            "name": "ERICA5779-Subscriber-5",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-103",
+            "name": "ERICA5779-TestSub-PWT-103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-2",
+            "name": "ERICA5779-Subscriber-2",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": true
+          },
+          {
+            "id": "ERICA5779-Subscriber-3",
+            "name": "ERICA5779-Subscriber-3",
+            "isPermitted": false
+          },
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          }
+        ]
+      }
+    }
+  }
+}
+class ActivatedRouteMock<T>{
+  queryParams() {
+    return {
+      serviceModelId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44'
+    }
+  }
+}
+
+class MockFeatureFlagsService {}
+
+describe('Generic Form popup Service', () => {
+  let injector;
+  let service: GenericFormPopupService;
+  let httpMock: HttpTestingController;
+  let form : FormGroup;
+  let fb : FormBuilder;
+  let netwokPopupService : NetworkPopupService;
+  let vfModulePopupService : VfModulePopuopService;
+  let servicePopupService : ServicePopupService;
+  let _aaiService : AaiService;
+  let _activatedRoute : ActivatedRoute;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [GenericFormPopupService,
+        FormBuilder,
+        IframeService,
+        ServicePopupService,
+        BasicControlGenerator,
+        ServiceControlGenerator,
+        GenericFormService,
+        LogService,
+        DefaultDataGeneratorService,
+        BasicPopupService,
+        AaiService,
+        NetworkPopupService,
+        NetworkControlGenerator,
+        VfModulePopuopService,
+        VfModuleControlGenerator,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        {provide: ActivatedRoute, useClass: ActivatedRouteMock},
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(GenericFormPopupService);
+    httpMock = injector.get(HttpTestingController);
+    fb = injector.get(FormBuilder);
+    netwokPopupService = injector.get(NetworkPopupService);
+    vfModulePopupService = injector.get(VfModulePopuopService);
+    servicePopupService = injector.get(ServicePopupService);
+    _aaiService = injector.get(AaiService);
+    _activatedRoute = injector.get(ActivatedRoute);
+
+  })().then(done).catch(done.fail));
+
+
+  test('VL: getGenericFormDetails should return FormPopupDetails', () => {
+    let uuidData : UUIDData = <any>{
+      type : 'VL',
+      serviceId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+      networkId : 'ExtVL 0',
+      networkStoreKey : 'ExtVL 0',
+      popupService : netwokPopupService
+    };
+    let node : ITreeNode = <any>{data : {} };
+
+    jest.spyOn(uuidData.popupService ,'getGenericFormPopupDetails');
+    service.getGenericFormDetails(uuidData, node,true);
+
+    expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledTimes(1);
+    expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledWith(uuidData['serviceId'],
+      uuidData['networkId'],
+      uuidData['networkStoreKey'],
+      node,
+      uuidData,
+      true
+    );
+  });
+
+  test('VFmodule: getGenericFormDetails should return FormPopupDetails', () => {
+    let uuidData : UUIDData = <any>{
+      type : 'VFmodule',
+      serviceId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+      vnfStoreKey : 'VF_vMee 0',
+      vFModuleStoreKey : 'vf_vmee0..VfVmee..vmme_vlc..module-1',
+      popupService : vfModulePopupService
+    };
+    let node : ITreeNode = <any>{data : {}};
+
+    spyOn(uuidData.popupService ,'getGenericFormPopupDetails');
+    service.getGenericFormDetails(uuidData, node,true);
+
+    expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledTimes(1)
+    expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledWith(
+      uuidData['serviceId'],
+      uuidData['vnfStoreKey'],
+      uuidData['vFModuleStoreKey'],
+      node,
+      uuidData,
+      true
+    );
+  });
+
+
+  test('service: getGenericFormDetails should return FormPopupDetails', () => {
+    let uuidData : UUIDData = <any>{
+      type : 'service',
+      serviceId : '6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+      popupService : servicePopupService
+    };
+    let node : ITreeNode = <any>{data : {}};
+
+    jest.spyOn(uuidData.popupService ,'getGenericFormPopupDetails');
+    service.getGenericFormDetails(uuidData, node,true);
+
+    expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledTimes(1);
+    expect(uuidData.popupService.getGenericFormPopupDetails).toHaveBeenCalledWith(
+      uuidData['serviceId'],
+      null,
+      null,
+      node,
+      uuidData,
+      true
+    );
+  });
+
+
+  test('initReduxOnCreateNewService',() => {
+    jest.spyOn(_aaiService, 'getServiceModelById');
+    service.initReduxOnCreateNewService();
+  })
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.ts
new file mode 100644 (file)
index 0000000..6636a54
--- /dev/null
@@ -0,0 +1,93 @@
+import {Injectable} from "@angular/core";
+import {IframeService} from "../../utils/iframe.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {ServicePopupService} from "./genericFormServices/service/service.popup.service";
+import {ActivatedRoute} from "@angular/router";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {UUIDData} from "./generic-form-popup.component";
+import {FormPopupDetails} from "../../models/formControlModels/formPopupDetails.model";
+import {Subject} from "rxjs";
+import {deleteAllServiceInstances} from "../../storeUtil/utils/service/service.actions";
+
+@Injectable()
+export class GenericFormPopupService {
+  constructor(private _iframeService : IframeService,
+              private _store: NgRedux<AppState>,
+              private _servicePopupService : ServicePopupService,
+              public _activatedRoute : ActivatedRoute,
+              private _aaiService : AaiService){
+
+  }
+  getGenericFormDetails(uuidData : UUIDData, node : ITreeNode, isUpdateMode : boolean) : FormPopupDetails {
+    switch (uuidData.type){
+      case 'VL' : {
+        return uuidData.popupService.getGenericFormPopupDetails(
+          uuidData['serviceId'],
+          uuidData['networkId'],
+          uuidData['networkStoreKey'],
+          node,
+          uuidData,
+          isUpdateMode
+        );
+      }
+      case 'VFmodule' : {
+        return uuidData.popupService.getGenericFormPopupDetails(
+          uuidData['serviceId'],
+          uuidData['vnfStoreKey'],
+          uuidData['vFModuleStoreKey'],
+          node,
+          uuidData,
+          isUpdateMode
+        );
+      }
+      case 'VF' : {
+        return uuidData.popupService.getGenericFormPopupDetails(
+          uuidData['serviceId'],
+          uuidData['modelName'],
+          uuidData['vnfStoreKey'],
+          node,
+          uuidData,
+          isUpdateMode
+        );
+      }
+      case 'VnfGroup' : {
+        return uuidData.popupService.getGenericFormPopupDetails(
+          uuidData['serviceId'],
+          uuidData['modelName'],
+          uuidData['vnfGroupStoreKey'],
+          node,
+          uuidData,
+          isUpdateMode
+        );
+      }
+      case 'service' : {
+        uuidData['bulkSize'] = this._store.getState().service.serviceInstance[uuidData['serviceId']].bulkSize || 1;
+        return uuidData.popupService.getGenericFormPopupDetails(
+          uuidData['serviceId'],
+          null,
+          null,
+          node,
+          uuidData,
+          isUpdateMode
+        );
+      }
+    }
+  }
+
+  initReduxOnCreateNewService() : Promise<string> {
+    return new Promise((resolve, reject) => {
+      this._activatedRoute
+        .queryParams
+        .subscribe(params => {
+          this._store.dispatch(deleteAllServiceInstances());
+          this._aaiService.getServiceModelById(params.serviceModelId).subscribe(()=>{
+            resolve(params.serviceModelId);
+          });
+      });
+    });
+  }
+
+  refreshModalCheckForGeneralErrorTrigger : Subject<boolean> = new Subject<boolean>();
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.spec.ts
new file mode 100644 (file)
index 0000000..521e5fb
--- /dev/null
@@ -0,0 +1,92 @@
+import {NetworkPopupService} from "./network/network.popup.service";
+import {LogService} from "../../../utils/log/log.service";
+import {ReflectiveInjector} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {BasicControlGenerator} from "../../genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../services/aaiService/aai.service";
+import {HttpClient} from "@angular/common/http";
+import {NetworkControlGenerator} from "../../genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {GenericFormService} from "../../genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {IframeService} from "../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {FormControlModel} from "../../../models/formControlModels/formControl.model";
+import {BasicPopupService} from "./basic.popup.service";
+import {SdcUiServices} from "onap-ui-angular";
+import {FeatureFlagsService} from "../../../services/featureFlag/feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockAppStore<T> {}
+
+class MockModalService<T> {}
+
+class MockFeatureFlagsService {}
+
+class MockReduxStore<T> {
+  getState() {
+    return {"global":{"name":null,"flags":{"FLAG_NETWORK_TO_ASYNC_INSTANTIATION":false,"FLAG_SHOW_ASSIGNMENTS":true,"FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS":true,"FLAG_UNASSIGN_SERVICE":true,"FLAG_SHOW_VERIFY_SERVICE":false,"FLAG_COLLECTION_RESOURCE_SUPPORT":true,"FLAG_DUPLICATE_VNF":true,"FLAG_SERVICE_MODEL_CACHE":true,"FLAG_ADVANCED_PORTS_FILTER":true,"CREATE_INSTANCE_TEST":false,"FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD":false,"FLAG_REGION_ID_FROM_REMOTE":true,"FLAG_ASYNC_INSTANTIATION":true,"FLAG_ASYNC_JOBS":true,"EMPTY_DRAWING_BOARD_TEST":false,"FLAG_ADD_MSO_TESTAPI_FIELD":true},"type":"[FLAGS] Update"},"service":{"serviceHierarchy":{"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":"Emanuel","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"false","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":{"max_instances":10,"min_instances":1,"gpb2_Internal2_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","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":"false","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","vlc_st_interface_type_oam":"management","multi_stage_design":"true","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"10.0.0.10","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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":true},"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":true},"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":{}},"6b528779-44a3-4472-bdff-9cd15ec93450":{"service":{"uuid":"6b528779-44a3-4472-bdff-9cd15ec93450","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"action-data","version":"1.0","toscaModelURL":null,"category":"","serviceType":"","serviceRole":"","description":"","serviceEcompNaming":"false","instantiationType":"A-La-Carte","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":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":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":"10.0.0.10","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":"10.0.0.10","is_AVPN_service":"false","vmx_RSG_name":"vREXI-affinity","vmx_int_ctl_forwarding":"l2","vmxvre_oam_ip_0":"10.0.0.10","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":"10.0.0.10","ecomp_generated_naming":"false","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.0.0.10","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":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":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":"10.0.0.10","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":"10.0.0.10","is_AVPN_service":"false","vmx_RSG_name":"vREXI-affinity","vmx_int_ctl_forwarding":"l2","vmxvre_oam_ip_0":"10.0.0.10","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","min_instances":"1","vmxvpfe_sriov44_0_port_vlanstrip":"false","vf_module_id":"123","nf_function":"JAI","vmxvpfe_sriov43_0_port_unknownmulticastallow":"true","vmxvre_int_ctl_ip_0":"10.0.0.10","ecomp_generated_naming":"false","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.0.0.10","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":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":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":"10.0.0.10","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":"10.0.0.10","is_AVPN_service":"false","vmx_RSG_name":"vREXI-affinity","vmx_int_ctl_forwarding":"l2","vmxvre_oam_ip_0":"10.0.0.10","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","max_instances":"3","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","min_instances":"1","vmxvpfe_sriov44_0_port_vlanstrip":"false","vf_module_id":"123","nf_function":"JAI","vmxvpfe_sriov43_0_port_unknownmulticastallow":"true","vmxvre_int_ctl_ip_0":"10.0.0.10","ecomp_generated_naming":"false","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.0.0.10","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":{"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":{"vnf_config_template_version":{"type":"string","description":"VPE Software Version","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"17.2"},"bandwidth_units":{"type":"string","description":"Units of bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"Gbps"},"bandwidth":{"type":"string","description":"Requested VPE bandwidth","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"10"},"AIC_CLLI":{"type":"string","description":"AIC Site CLLI","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"ATLMY8GA"},"ASN":{"type":"string","description":"AV/PE","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"AV_vPE"},"vnf_instance_name":{"type":"string","description":"The hostname assigned to the vpe.","entry_schema":null,"inputProperties":null,"constraints":[],"required":true,"default":"mtnj309me6"}},"commands":{},"properties":{"min_instances":1,"max_instances":10,"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":{},"fabricConfigurations":{},"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":{"6e59c5de-f052-46fa-aa7e-2fca9d674c44":{"vnfs":{"VF_vMee 0":{"rollbackOnFailure":"true","vfModules":{"vf_vmee0..VfVmee..base_vmme..module-0":{"vf_vmee0..VfVmee..base_vmme..module-0vmvzo":{"isMissingData":false,"sdncPreReload":null,"modelInfo":{"modelType":"VFmodule","modelInvariantId":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","modelVersionId":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","modelName":"VfVmee..base_vmme..module-0","modelVersion":"2","modelCustomizationId":"f8c040f1-7e51-4a11-aca8-acf256cfd861","modelCustomizationName":"VfVmee..base_vmme..module-0"},"instanceParams":[{}],"trackById":"wmtm6sy2uj"}}},"isMissingData":true,"originalName":"VF_vMee 0","vnfStoreKey":"VF_vMee 0","trackById":"p3wk448m5do","uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","productFamilyId":"36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e","lcpCloudRegionId":null,"tenantId":null,"lineOfBusiness":null,"platformName":null,"modelInfo":{"modelType":"VF","modelInvariantId":"4160458e-f648-4b30-a176-43881ffffe9e","modelVersionId":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","modelName":"VF_vMee","modelVersion":"2.0","modelCustomizationName":"VF_vMee 0"}}},"networks":{},"instanceParams":[{}],"validationCounter":1,"existingNames":{},"existingVNFCounterMap":{"d6557200-ecf2-4641-8094-5393ae3aae60":1},"globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","subscriptionServiceType":"TYLER SILVIA","owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","productFamilyId":"36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","aicZoneId":"JAG1","projectName":"x1","rollbackOnFailure":"true","bulkSize":1,"modelInfo":{"modelInvariantId":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","modelVersionId":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","modelName":"ComplexService","modelVersion":"1.0","uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44"},"isALaCarte":false,"name":"ComplexService","version":"1.0","description":"ComplexService","category":"Emanuel","uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","serviceType":"","serviceRole":"","isEcompGeneratedNaming":true,"isMultiStepDesign":false},"6b528779-44a3-4472-bdff-9cd15ec93450":{"networks":{"ExtVL 0":{"rollbackOnFailure":"true","isMissingData":false,"originalName":"ExtVL 0","networkStoreKey":"ExtVL 0","trackById":"sf3zth68xjf","productFamilyId":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","platformName":"xxx1","lineOfBusiness":"ONAP","instanceParams":[{}],"modelInfo":{"modelInvariantId":"379f816b-a7aa-422f-be30-17114ff50b7c","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelName":"ExtVL","modelVersion":"37.0","modelCustomizationId":"94fdd893-4a36-4d70-b16a-ec29c54c184f","modelCustomizationName":"ExtVL 0","uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"ExtVL 0:0001":{"rollbackOnFailure":"true","isMissingData":false,"originalName":"ExtVL 0","networkStoreKey":"ExtVL 0","trackById":"2mdxioxca9h","productFamilyId":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","platformName":"xxx1","lineOfBusiness":"ONAP","instanceParams":[{}],"modelInfo":{"modelInvariantId":"379f816b-a7aa-422f-be30-17114ff50b7c","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelName":"ExtVL","modelVersion":"37.0","modelCustomizationId":"94fdd893-4a36-4d70-b16a-ec29c54c184f","modelCustomizationName":"ExtVL 0","uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"ExtVL 0_1":{"rollbackOnFailure":"true","isMissingData":false,"originalName":"ExtVL 0","networkStoreKey":"ExtVL 0_1","trackById":"z7vd1gmpbs","instanceName":"ExtVL","productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"hvf6","tenantId":"229bcdc6eaeb4ca59d55221141d01f8e","platformName":"xxx1","lineOfBusiness":"zzz1","instanceParams":[{"vnf_config_template_version":"17.2","bandwidth_units":"Gbps","bandwidth":"10","AIC_CLLI":"ATLMY8GA","ASN":"AV_vPE","vnf_instance_name":"yoav"}],"modelInfo":{"modelInvariantId":"379f816b-a7aa-422f-be30-17114ff50b7c","modelVersionId":"ddc3f20c-08b5-40fd-af72-c6d14636b986","modelName":"ExtVL","modelVersion":"37.0","modelCustomizationId":"94fdd893-4a36-4d70-b16a-ec29c54c184f","modelCustomizationName":"ExtVL 0","uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"},"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986"}},"vnfs":{"2017-488_ADIOD-vPE 0":{"rollbackOnFailure":"true","vfModules":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1":{"2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi":{"instanceName":"yoav","volumeGroupName":"123","modelInfo":{"modelInvariantId":"7253ff5c-97f0-4b8b-937c-77aeb4d79aa1","modelVersionId":"25284168-24bb-4698-8cb4-3f509146eca5","modelName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","modelVersion":"6","modelCustomizationId":"f7e7c365-60cf-49a9-9ebf-a1aa11b9d401","modelCustomizationName":"2017488AdiodVpe..ADIOD_vRE_BV..module-1","uuid":"25284168-24bb-4698-8cb4-3f509146eca5"},"uuid":"25284168-24bb-4698-8cb4-3f509146eca5","isMissingData":false,"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"}]}}},"isMissingData":false,"originalName":"2017-488_ADIOD-vPE 0","vnfStoreKey":"2017-488_ADIOD-vPE 0","trackById":"o65b26t2thj","instanceName":"2017488_ADIODvPE","productFamilyId":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","lcpCloudRegionId":"hvf6","tenantId":"bae71557c5bb4d5aac6743a4e5f1d054","platformName":"platform","lineOfBusiness":"ONAP","instanceParams":[{}],"modelInfo":{"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","uuid":"69e09f68-8b63-4cc9-b9ff-860960b5db09"},"uuid":"69e09f68-8b63-4cc9-b9ff-860960b5db09"}},"instanceParams":[{"2017488_adiodvpe0_ASN":"AV_vPE"}],"validationCounter":0,"existingNames":{"123":"","instancename":"","yoav":"","extvl":""},"existingVNFCounterMap":{"69e09f68-8b63-4cc9-b9ff-860960b5db09":1},"existingNetworksCounterMap":{"ddc3f20c-08b5-40fd-af72-c6d14636b986":3},"instanceName":"InstanceName","globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","subscriptionServiceType":"TYLER SILVIA","owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","productFamilyId":"17cc1042-527b-11e6-beb8-9e71128cae77","lcpCloudRegionId":"JANET25","tenantId":"092eb9e8e4b7412e8787dd091bc58e86","aicZoneId":"JAG1","projectName":null,"rollbackOnFailure":"true","aicZoneName":"YUDFJULP-JAG1","owningEntityName":"WayneHolland","testApi":"GR_API","isEcompGeneratedNaming":false,"tenantName":"USP-SIP-IC-24335-T-01","bulkSize":1,"modelInfo":{"modelInvariantId":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","modelVersionId":"6b528779-44a3-4472-bdff-9cd15ec93450","modelName":"action-data","modelVersion":"1.0","uuid":"6b528779-44a3-4472-bdff-9cd15ec93450"},"isALaCarte":false,"name":"action-data","version":"1.0","description":"","category":"","uuid":"6b528779-44a3-4472-bdff-9cd15ec93450","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","serviceType":"","serviceRole":"","isMultiStepDesign":false}},"lcpRegionsAndTenants":{"lcpRegionList":[{"id":"JANET25","name":"JANET25","isPermitted":true},{"id":"hvf6","name":"hvf6","isPermitted":true}],"lcpRegionsTenantsMap":{"JANET25":[{"id":"092eb9e8e4b7412e8787dd091bc58e86","name":"USP-SIP-IC-24335-T-01","isPermitted":true}],"hvf6":[{"id":"bae71557c5bb4d5aac6743a4e5f1d054","name":"AIN Web Tool-15-D-testalexandria","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-hvf6-09","isPermitted":true},{"id":"cbb99fe4ada84631b7baf046b6fd2044","name":"DN5242-Nov16-T3","isPermitted":true}]}},"productFamilies":[{"id":"ebc3bc3d-62fd-4a3f-a037-f619df4ff034","name":"SCOTTIE","isPermitted":true},{"id":"17cc1042-527b-11e6-beb8-9e71128cae77","name":"IGNACIO","isPermitted":true},{"id":"36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e","name":"Christie","isPermitted":true},{"id":"a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7","name":"Enhanced Services","isPermitted":true},{"id":"vTerrance","name":"vTerrance","isPermitted":true},{"id":"323d69d9-2efe-4r45-ay0a-89ea7ard4e6f","name":"vSCP","isPermitted":true},{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb","name":"Emanuel","isPermitted":true},{"id":"d8a6ed93-251c-47ca-adc9-86671fd19f4c","name":"BVOIP","isPermitted":true},{"id":"db171b8f-115c-4992-a2e3-ee04cae357e0","name":"LINDSEY","isPermitted":true},{"id":"LRSI-OSPF","name":"LRSI-OSPF","isPermitted":true},{"id":"vRosemarie","name":"HNGATEWAY","isPermitted":true},{"id":"vHNPaas","name":"WILKINS","isPermitted":true},{"id":"e433710f-9217-458d-a79d-1c7aff376d89","name":"TYLER SILVIA","isPermitted":true},{"id":"b6a3f28c-eebf-494c-a900-055cc7c874ce","name":"VROUTER","isPermitted":true},{"id":"Cisneros","name":"vMuriel","isPermitted":true},{"id":"0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1","name":"CARA Griffin","isPermitted":true},{"id":"c7611ebe-c324-48f1-8085-94aef0c6ef3d","name":"DARREN MCGEE","isPermitted":true},{"id":"e30755dc-5673-4b6b-9dcf-9abdd96b93d1","name":"Transport","isPermitted":true},{"id":"vSalvatore","name":"vSalvatore","isPermitted":true},{"id":"d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4","name":"Josefina","isPermitted":true},{"id":"vHubbard","name":"vHubbard","isPermitted":true},{"id":"12a96a9d-4b4c-4349-a950-fe1159602621","name":"DARREN MCGEE","isPermitted":true}],"serviceTypes":{"e433710f-9217-458d-a79d-1c7aff376d89":[{"id":"0","name":"vRichardson","isPermitted":false},{"id":"1","name":"TYLER SILVIA","isPermitted":true},{"id":"2","name":"Emanuel","isPermitted":false},{"id":"3","name":"vJamie","isPermitted":false},{"id":"4","name":"vVoiceMail","isPermitted":false},{"id":"5","name":"Kennedy","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":"LINDSEY","isPermitted":false},{"id":"17","name":"JOHANNA_SANTOS","isPermitted":false},{"id":"18","name":"vCarroll","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":"WayneHolland"},{"id":"Melissa","name":"Melissa"}],"projectList":[{"id":"WATKINS","name":"WATKINS"},{"id":"x1","name":"x1"},{"id":"yyy1","name":"yyy1"}],"lineOfBusinessList":[{"id":"ONAP","name":"ONAP"},{"id":"zzz1","name":"zzz1"}],"platformList":[{"id":"platform","name":"platform"},{"id":"xxx1","name":"xxx1"}]},"type":"[LCP_REGIONS_AND_TENANTS] Update","subscribers":[{"id":"CAR_2020_ER","name":"CAR_2020_ER","isPermitted":true},{"id":"21014aa2-526b-11e6-beb8-9e71128cae77","name":"JULIO ERICKSON","isPermitted":false},{"id":"DHV1707-TestSubscriber-2","name":"DALE BRIDGES","isPermitted":false},{"id":"DHV1707-TestSubscriber-1","name":"LLOYD BRIDGES","isPermitted":false},{"id":"jimmy-example","name":"JimmyExampleCust-20161102","isPermitted":false},{"id":"jimmy-example2","name":"JimmyExampleCust-20161103","isPermitted":false},{"id":"ERICA5779-TestSub-PWT-102","name":"ERICA5779-TestSub-PWT-102","isPermitted":false},{"id":"ERICA5779-TestSub-PWT-101","name":"ERICA5779-TestSub-PWT-101","isPermitted":false},{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb","name":"Emanuel","isPermitted":false},{"id":"ERICA5779-Subscriber-4","name":"ERICA5779-Subscriber-5","isPermitted":false},{"id":"ERICA5779-TestSub-PWT-103","name":"ERICA5779-TestSub-PWT-103","isPermitted":false},{"id":"ERICA5779-Subscriber-2","name":"ERICA5779-Subscriber-2","isPermitted":false},{"id":"e433710f-9217-458d-a79d-1c7aff376d89","name":"SILVIA ROBBINS","isPermitted":true},{"id":"ERICA5779-Subscriber-3","name":"ERICA5779-Subscriber-3","isPermitted":false},{"id":"31739f3e-526b-11e6-beb8-9e71128cae77","name":"CRAIG/ROBERTS","isPermitted":false}]}};
+  }
+}
+
+describe('Basic popup service', () => {
+  let injector;
+  let service: BasicPopupService;
+  let genericFormService : GenericFormService;
+  let defaultDataGeneratorService : DefaultDataGeneratorService;
+  let fb : FormBuilder;
+  let iframeService : IframeService;
+
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      providers : [
+        NetworkPopupService,
+        BasicControlGenerator,
+        NetworkControlGenerator,
+        DefaultDataGeneratorService,
+        GenericFormService,
+        FormBuilder,
+        IframeService,
+        AaiService,
+        LogService,
+        BasicPopupService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        {provide: NgRedux, useClass: MockReduxStore},
+        {provide: HttpClient, useClass: MockAppStore},
+        {provide: SdcUiServices.ModalService, useClass: MockModalService}
+      ]
+    });
+    await TestBed.compileComponents();
+    injector = getTestBed();
+    service = injector.get(BasicPopupService);
+    genericFormService = injector.get(GenericFormService);
+    defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+    fb = injector.get(FormBuilder);
+    iframeService = injector.get(IframeService);
+
+  })().then(done).catch(done.fail));
+
+
+
+
+  test('getDynamicInputs should list of formControl model', () => {
+    const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const networkModel : string = 'ExtVL 0';
+    const networkStoreKey : string = null;
+    const controls : FormControlModel[] = service.getDynamicInputs(serviceId, networkModel, networkStoreKey, 'networks');
+    expect(controls.length).toEqual(6);
+    for(let i = 0 ; i < controls.length ; i++){
+      expect(controls[i].type).toEqual('INPUT');
+      expect(controls[i].isVisible).toBeTruthy();
+    }
+  });
+
+  test('getModelFromResponse should return undefined if raw model not exist', () => {
+    const result= service.getModelFromResponse({
+      "modelType" : {
+        "modelName" : null
+      }
+    }, 'modelType', 'modelName');
+    expect(result).toBeUndefined();
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.ts
new file mode 100644 (file)
index 0000000..5d4d165
--- /dev/null
@@ -0,0 +1,54 @@
+import {Injectable} from "@angular/core";
+import {Subscriber} from "../../../models/subscriber";
+import {NetworkModel} from "../../../models/networkModel";
+import {AppState} from "../../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {FormControlModel} from "../../../models/formControlModels/formControl.model";
+import {DefaultDataGeneratorService} from "../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicControlGenerator} from "../../genericForm/formControlsServices/basic.control.generator";
+import * as _ from 'lodash';
+import {VfModule} from "../../../models/vfModule";
+import {VNFModel} from "../../../models/vnfModel";
+import {VnfGroupModel} from "../../../models/vnfGroupModel";
+
+@Injectable()
+export class BasicPopupService {
+  constructor(private _store: NgRedux<AppState>,
+              private _defaultDataGeneratorService : DefaultDataGeneratorService,
+              private _basicControlGenerator : BasicControlGenerator){}
+
+  extractSubscriberNameBySubscriberId(subsriberId: string) {
+    let result: string = null;
+    let 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;
+  }
+
+  getModelFromResponse(result: any, modelType: string, modelName: string) {
+    let rawModel = result[modelType][modelName];
+    if (!rawModel) return;
+    switch (modelType){
+      case 'vnfs' : {
+        return new VNFModel(rawModel);
+      }
+      case 'vfModules' : {
+        return new VfModule(rawModel);
+      }
+      case 'networks' : {
+        return new NetworkModel(rawModel);
+      }
+      case 'vnfGroups' : {
+        return new VnfGroupModel(rawModel);
+      }
+    }
+  }
+
+  getDynamicInputs(serviceId : string, modelName : string, storeKey : string, type : string) : FormControlModel[]{
+    let dynamic = this._defaultDataGeneratorService.getArbitraryInputs(this._store.getState().service.serviceHierarchy[serviceId][type][modelName].inputs);
+      return this._basicControlGenerator.getDynamicInputsByType(dynamic, serviceId, storeKey, type );
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/generic-popup.interface.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/generic-popup.interface.ts
new file mode 100644 (file)
index 0000000..7324c64
--- /dev/null
@@ -0,0 +1,25 @@
+/***********************************************************
+ onSubmit : action when set button is clicked
+ onCancel : action when cancel/X button is clicked
+ getModelInformation : should generate the model information
+ getGenericFormPopupDetails : returns list of controls
+ getInstance :  returns exists instance (if exist)
+ getTitle :  returns generic popup title
+ getSubLeftTitle :  returns generic popup left sub title
+ getSubRightTitle :  returns generic popup right sub title
+ ***********************************************************/
+
+import {FormGroup} from "@angular/forms";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {FormPopupDetails} from "../../../models/formControlModels/formPopupDetails.model";
+
+export interface GenericPopupInterface {
+  onSubmit(that, form: FormGroup, ...args) : void;
+  onCancel(that, form) : void;
+  getModelInformation(serviceId : string, modelName : string) : void;
+  getGenericFormPopupDetails(serviceId : string, modelName : string , storeKey : string, node : ITreeNode, uuidData : Object, isUpdateMode : boolean) : FormPopupDetails;
+  getInstance(serviceId : string, modelName : string , storeKey : string) : any;
+  getTitle(isUpdateMode : boolean) : string;
+  getSubLeftTitle() : string;
+  getSubRightTitle() : string;
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.spec.ts
new file mode 100644 (file)
index 0000000..30164b8
--- /dev/null
@@ -0,0 +1,2395 @@
+import {NetworkPopupService} from "./network.popup.service";
+import {LogService} from "../../../../utils/log/log.service";
+import {SdcUiServices} from "onap-ui-angular";
+import {ReflectiveInjector} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {HttpClient} from "@angular/common/http";
+import {NetworkControlGenerator} from "../../../genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {GenericFormService} from "../../../genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockAppStore<T> {}
+
+class MockModalService<T> {}
+
+class MockReduxStore<T> {
+  getState() {
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "FLAG_ADVANCED_PORTS_FILTER": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+          "FLAG_REGION_ID_FROM_REMOTE": true,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": "Emanuel",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "ComplexService",
+              "serviceEcompNaming": "false",
+              "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": {
+                  "max_instances": 10,
+                  "min_instances": 1,
+                  "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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": "false",
+                  "sctp-a-IPv6_ethertype": "IPv6",
+                  "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "true",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": true
+                  },
+                  "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": {
+                  "netowrk_role": "role 1, role 2, role 3",
+                  "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": true
+              },
+              "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": {}
+          },
+          "6b528779-44a3-4472-bdff-9cd15ec93450": {
+            "service": {
+              "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+              "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "name": "action-data",
+              "version": "1.0",
+              "toscaModelURL": null,
+              "category": "",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "",
+              "serviceEcompNaming": "false",
+              "instantiationType": "A-La-Carte",
+              "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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",
+                  "min_instances": "1",
+                  "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                  "vf_module_id": "123",
+                  "nf_function": "JAI",
+                  "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                  "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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",
+                  "max_instances": "3",
+                  "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",
+                  "min_instances": "1",
+                  "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                  "vf_module_id": "123",
+                  "nf_function": "JAI",
+                  "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                  "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {
+              "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "mtnj309me6"
+                  }
+                },
+                "commands": {},
+                "properties": {
+                  "network_role" : "network role 1, network role 2",
+                  "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": {},
+            "fabricConfigurations": {},
+            "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": {
+          "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+            "vnfs": {
+              "VF_vMee 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "vf_vmee0..VfVmee..base_vmme..module-0": {
+                    "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+                      "isMissingData": false,
+                      "sdncPreReload": null,
+                      "modelInfo": {
+                        "modelType": "VFmodule",
+                        "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+                        "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+                        "modelName": "VfVmee..base_vmme..module-0",
+                        "modelVersion": "2",
+                        "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                        "modelCustomizationName": "VfVmee..base_vmme..module-0"
+                      },
+                      "instanceParams": [{}],
+                      "trackById": "wmtm6sy2uj"
+                    }
+                  }
+                },
+                "isMissingData": true,
+                "originalName": "VF_vMee 0",
+                "vnfStoreKey": "VF_vMee 0",
+                "trackById": "p3wk448m5do",
+                "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+                "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+                "lcpCloudRegionId": null,
+                "tenantId": null,
+                "lineOfBusiness": null,
+                "platformName": null,
+                "modelInfo": {
+                  "modelType": "VF",
+                  "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+                  "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+                  "modelName": "VF_vMee",
+                  "modelVersion": "2.0",
+                  "modelCustomizationName": "VF_vMee 0"
+                }
+              }
+            },
+            "networks": {},
+            "instanceParams": [{}],
+            "validationCounter": 1,
+            "existingNames": {},
+            "existingVNFCounterMap": {"d6557200-ecf2-4641-8094-5393ae3aae60": 1},
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "lcpCloudRegionId": "hvf6",
+            "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "aicZoneId": "JAG1",
+            "projectName": "x1",
+            "rollbackOnFailure": "true",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "modelName": "ComplexService",
+              "modelVersion": "1.0",
+              "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+            },
+            "isALaCarte": false,
+            "name": "ComplexService",
+            "version": "1.0",
+            "description": "ComplexService",
+            "category": "Emanuel",
+            "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isMultiStepDesign": false
+          },
+          "6b528779-44a3-4472-bdff-9cd15ec93450": {
+            "networks": {
+              "ExtVL 0": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0",
+                "trackById": "sf3zth68xjf",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [{}],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              },
+              "ExtVL 0:0001": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0",
+                "trackById": "2mdxioxca9h",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [{}],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              },
+              "ExtVL 0_1": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0_1",
+                "trackById": "z7vd1gmpbs",
+                "instanceName": "ExtVL",
+                "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "zzz1",
+                "instanceParams": [{
+                  "vnf_config_template_version": "17.2",
+                  "bandwidth_units": "Gbps",
+                  "bandwidth": "10",
+                  "AIC_CLLI": "ATLMY8GA",
+                  "ASN": "AV_vPE",
+                  "vnf_instance_name": "yoav"
+                }],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              }
+            },
+            "vnfs": {
+              "2017-488_ADIOD-vPE 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+                      "instanceName": "yoav",
+                      "volumeGroupName": "123",
+                      "modelInfo": {
+                        "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                        "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                        "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                        "modelVersion": "6",
+                        "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                        "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                        "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                      },
+                      "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                      "isMissingData": false,
+                      "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"
+                      }]
+                    }
+                  }
+                },
+                "isMissingData": false,
+                "originalName": "2017-488_ADIOD-vPE 0",
+                "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+                "trackById": "o65b26t2thj",
+                "instanceName": "2017488_ADIODvPE",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "platformName": "platform",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [{}],
+                "modelInfo": {
+                  "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",
+                  "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+                },
+                "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+              }
+            },
+            "instanceParams": [{"2017488_adiodvpe0_ASN": "AV_vPE"}],
+            "validationCounter": 0,
+            "existingNames": {"123": "", "instancename": "", "yoav": "", "extvl": ""},
+            "existingVNFCounterMap": {"69e09f68-8b63-4cc9-b9ff-860960b5db09": 1},
+            "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 3},
+            "instanceName": "InstanceName",
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "aicZoneId": "JAG1",
+            "projectName": null,
+            "rollbackOnFailure": "true",
+            "aicZoneName": "YUDFJULP-JAG1",
+            "owningEntityName": "WayneHolland",
+            "testApi": "GR_API",
+            "tenantName": "USP-SIP-IC-24335-T-01",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+              "modelName": "action-data",
+              "modelVersion": "1.0",
+              "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+            },
+            "isALaCarte": false,
+            "name": "action-data",
+            "version": "1.0",
+            "description": "",
+            "category": "",
+            "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isMultiStepDesign": false
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [{
+            "id": "JANET25",
+            "name": "JANET25",
+            "isPermitted": true
+          }, {"id": "hvf6", "name": "hvf6", "isPermitted": true}],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [{
+              "id": "092eb9e8e4b7412e8787dd091bc58e86",
+              "name": "USP-SIP-IC-24335-T-01",
+              "isPermitted": true
+            }],
+            "hvf6": [{
+              "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+              "name": "AIN Web Tool-15-D-testalexandria",
+              "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-hvf6-09",
+              "isPermitted": true
+            }, {"id": "cbb99fe4ada84631b7baf046b6fd2044", "name": "DN5242-Nov16-T3", "isPermitted": true}]
+          }
+        },
+        "productFamilies": [{
+          "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+          "name": "SCOTTIE",
+          "isPermitted": true
+        }, {
+          "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+          "name": "IGNACIO",
+          "isPermitted": true
+        }, {
+          "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+          "name": "Christie",
+          "isPermitted": true
+        }, {
+          "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+          "name": "Enhanced Services",
+          "isPermitted": true
+        }, {"id": "vTerrance", "name": "vTerrance", "isPermitted": true}, {
+          "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+          "name": "vSCP",
+          "isPermitted": true
+        }, {
+          "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+          "name": "Emanuel",
+          "isPermitted": true
+        }, {
+          "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+          "name": "BVOIP",
+          "isPermitted": true
+        }, {"id": "db171b8f-115c-4992-a2e3-ee04cae357e0", "name": "LINDSEY", "isPermitted": true}, {
+          "id": "LRSI-OSPF",
+          "name": "LRSI-OSPF",
+          "isPermitted": true
+        }, {"id": "vRosemarie", "name": "HNGATEWAY", "isPermitted": true}, {
+          "id": "vHNPaas",
+          "name": "WILKINS",
+          "isPermitted": true
+        }, {
+          "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "name": "TYLER SILVIA",
+          "isPermitted": true
+        }, {"id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", "name": "VROUTER", "isPermitted": true}, {
+          "id": "Cisneros",
+          "name": "vMuriel",
+          "isPermitted": true
+        }, {
+          "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+          "name": "CARA Griffin",
+          "isPermitted": true
+        }, {
+          "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+          "name": "DARREN MCGEE",
+          "isPermitted": true
+        }, {"id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", "name": "Transport", "isPermitted": true}, {
+          "id": "vSalvatore",
+          "name": "vSalvatore",
+          "isPermitted": true
+        }, {"id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", "name": "Josefina", "isPermitted": true}, {
+          "id": "vHubbard",
+          "name": "vHubbard",
+          "isPermitted": true
+        }, {"id": "12a96a9d-4b4c-4349-a950-fe1159602621", "name": "DARREN MCGEE", "isPermitted": true}],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [{
+            "id": "0",
+            "name": "vRichardson",
+            "isPermitted": false
+          }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, {
+            "id": "2",
+            "name": "Emanuel",
+            "isPermitted": false
+          }, {"id": "3", "name": "vJamie", "isPermitted": false}, {
+            "id": "4",
+            "name": "vVoiceMail",
+            "isPermitted": false
+          }, {"id": "5", "name": "Kennedy", "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": "LINDSEY",
+            "isPermitted": false
+          }, {"id": "17", "name": "JOHANNA_SANTOS", "isPermitted": false}, {
+            "id": "18",
+            "name": "vCarroll",
+            "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": "WayneHolland"}, {
+            "id": "Melissa",
+            "name": "Melissa"
+          }],
+          "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}],
+          "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}],
+          "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}]
+        },
+        "type": "[LCP_REGIONS_AND_TENANTS] Update",
+        "subscribers": [{
+          "id": "CAR_2020_ER",
+          "name": "CAR_2020_ER",
+          "isPermitted": true
+        }, {
+          "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+          "name": "JULIO ERICKSON",
+          "isPermitted": false
+        }, {
+          "id": "DHV1707-TestSubscriber-2",
+          "name": "DALE BRIDGES",
+          "isPermitted": false
+        }, {"id": "DHV1707-TestSubscriber-1", "name": "LLOYD BRIDGES", "isPermitted": false}, {
+          "id": "jimmy-example",
+          "name": "JimmyExampleCust-20161102",
+          "isPermitted": false
+        }, {
+          "id": "jimmy-example2",
+          "name": "JimmyExampleCust-20161103",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-TestSub-PWT-102",
+          "name": "ERICA5779-TestSub-PWT-102",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-TestSub-PWT-101",
+          "name": "ERICA5779-TestSub-PWT-101",
+          "isPermitted": false
+        }, {
+          "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+          "name": "Emanuel",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-Subscriber-4",
+          "name": "ERICA5779-Subscriber-5",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-TestSub-PWT-103",
+          "name": "ERICA5779-TestSub-PWT-103",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-Subscriber-2",
+          "name": "ERICA5779-Subscriber-2",
+          "isPermitted": false
+        }, {
+          "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "name": "SILVIA ROBBINS",
+          "isPermitted": true
+        }, {
+          "id": "ERICA5779-Subscriber-3",
+          "name": "ERICA5779-Subscriber-3",
+          "isPermitted": false
+        }, {"id": "31739f3e-526b-11e6-beb8-9e71128cae77", "name": "CRAIG/ROBERTS", "isPermitted": false}]
+      }
+    };
+  }
+}
+
+class MockFeatureFlagsService {}
+
+describe('Network popup service', () => {
+  let injector;
+  let service: NetworkPopupService;
+  let genericFormService: GenericFormService
+  let defaultDataGeneratorService: DefaultDataGeneratorService;
+  let fb: FormBuilder;
+  let iframeService: IframeService;
+
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      providers : [
+        NetworkPopupService,
+        BasicControlGenerator,
+        NetworkControlGenerator,
+        DefaultDataGeneratorService,
+        GenericFormService,
+        FormBuilder,
+        IframeService,
+        AaiService,
+        LogService,
+        BasicPopupService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        {provide: NgRedux, useClass: MockReduxStore},
+        {provide: HttpClient, useClass: MockAppStore},
+        {provide: SdcUiServices.ModalService, useClass: MockModalService}
+      ]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(NetworkPopupService);
+    genericFormService = injector.get(GenericFormService);
+    defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+    fb = injector.get(FormBuilder);
+    iframeService = injector.get(IframeService);
+
+  })().then(done).catch(done.fail));
+
+  test('getTitle should return the correct title for edit and create mode', () => {
+    expect(service.getTitle(true)).toBe('Edit Network');
+    expect(service.getTitle(false)).toBe('Set new Network');
+  });
+
+  test('getSubLeftTitle should return network model name', () => {
+    service.uuidData = {
+      'networkId': 'Model name'
+    };
+    expect(service.getSubLeftTitle()).toBe('Model name');
+  });
+
+  test('getSubRightTitle should return popup type', () => {
+    expect(service.getSubRightTitle()).toBe('Network Instance Details');
+  });
+
+  test('getModelInformation should update modelInformations', () => {
+    const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const networkModel: string = 'ExtVL 0';
+
+    service.getModelInformation(serviceId, networkModel);
+    expect(service.modelInformations.length).toEqual(13);
+    expect(service.modelInformations[0].label).toEqual("Subscriber Name");
+    expect(service.modelInformations[0].values).toEqual(['SILVIA ROBBINS']);
+
+    expect(service.modelInformations[1].label).toEqual("Service Name");
+    expect(service.modelInformations[1].values).toEqual(['action-data']);
+
+    expect(service.modelInformations[2].label).toEqual("Service Instance Name");
+    expect(service.modelInformations[2].values).toEqual(['InstanceName']);
+
+    expect(service.modelInformations[3].label).toEqual("Model Name");
+    expect(service.modelInformations[3].values).toEqual(['ExtVL']);
+
+    expect(service.modelInformations[4].label).toEqual("Model version");
+    expect(service.modelInformations[4].values).toEqual(['37.0']);
+
+    expect(service.modelInformations[5].label).toEqual("Description");
+    expect(service.modelInformations[5].values).toEqual(['ECOMP generic virtual link (network) base type for all other service-level and global networks']);
+
+    expect(service.modelInformations[6].label).toEqual("Category");
+    expect(service.modelInformations[6].values).toEqual([undefined]);
+
+    expect(service.modelInformations[7].label).toEqual("Sub Category");
+    expect(service.modelInformations[7].values).toEqual([undefined]);
+
+    expect(service.modelInformations[8].label).toEqual("UUID");
+    expect(service.modelInformations[8].values).toEqual(['ddc3f20c-08b5-40fd-af72-c6d14636b986']);
+
+    expect(service.modelInformations[9].label).toEqual("Invariant UUID");
+    expect(service.modelInformations[9].values).toEqual(['379f816b-a7aa-422f-be30-17114ff50b7c']);
+
+    expect(service.modelInformations[10].label).toEqual("Service type");
+    expect(service.modelInformations[10].values).toEqual(['']);
+
+    expect(service.modelInformations[11].label).toEqual("Service role");
+    expect(service.modelInformations[11].values).toEqual(['']);
+
+    expect(service.modelInformations[12].label).toEqual('Network roles');
+    expect(service.modelInformations[12].values).toEqual( ['network role 1', ' network role 2']);
+  });
+
+
+  test('onCancel should trigger closeDialogEvent and iframe', () => {
+    let that = <any>{
+      parentElementClassName: 'content',
+      _iframeService: iframeService
+    };
+    jest.spyOn(iframeService, 'removeClassCloseModal');
+    jest.spyOn(service.closeDialogEvent, 'next');
+
+    service.onCancel(that, fb.group({}));
+
+    expect(that._iframeService.removeClassCloseModal).toHaveBeenCalledWith(that.parentElementClassName)
+    expect(service.closeDialogEvent.next).toHaveBeenCalledWith(that);
+  });
+
+  test('onSubmit should trigger onCancel', () => {
+    let that = <any>{
+      parentElementClassName: 'content',
+      _iframeService: iframeService,
+      storeNetwork: () => {
+      },
+      serviceModel: {
+        uuid: 'someUUID'
+      }
+    };
+    let form = fb.group({});
+    jest.spyOn(service, 'onCancel');
+    jest.spyOn(that, 'storeNetwork');
+    jest.spyOn(window.parent, 'postMessage');
+
+    service.onSubmit(that, form);
+
+    expect(service.onCancel).toHaveBeenCalledWith(that, form);
+    expect(that.storeNetwork).toHaveBeenCalledWith(that, form.value);
+    expect(window.parent.postMessage).toHaveBeenCalledWith({
+      eventId: 'submitIframe',
+      data: {
+        serviceModelId: 'someUUID'
+      }
+    }, "*");
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.ts
new file mode 100644 (file)
index 0000000..7f32360
--- /dev/null
@@ -0,0 +1,150 @@
+import {Injectable} from "@angular/core";
+import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {NetworkInstance} from "../../../../models/networkInstance";
+import {AppState} from "../../../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {NetworkControlGenerator} from "../../../genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {ModelInformationItem} from "../../../model-information/model-information.component";
+import {Constants} from "../../../../utils/constants";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {ServiceModel} from "../../../../models/serviceModel";
+import {FormGroup} from "@angular/forms";
+import {ModelInfo} from "../../../../models/modelInfo";
+import {IframeService} from "../../../../utils/iframe.service";
+import {GenericPopupInterface} from "../generic-popup.interface";
+import {Subject} from "rxjs/Subject";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import * as _ from 'lodash';
+import {BasicPopupService} from "../basic.popup.service";
+import {changeInstanceCounter} from "../../../../storeUtil/utils/general/general.actions";
+import {createNetworkInstance, updateNetworkInstance} from "../../../../storeUtil/utils/network/network.actions";
+
+@Injectable()
+export class NetworkPopupService implements GenericPopupInterface {
+  dynamicInputs: any;
+  instance: any;
+  model: any;
+  serviceModel: ServiceModel;
+  modelInformations: ModelInformationItem[] = [];
+  uuidData: Object;
+  closeDialogEvent: Subject<any> = new Subject<any>();
+  isUpdateMode: boolean;
+
+
+  constructor(private _basicControlGenerator: BasicControlGenerator,
+              private _networkControlGenerator: NetworkControlGenerator,
+              private _iframeService: IframeService,
+              private _defaultDataGeneratorService: DefaultDataGeneratorService,
+              private _aaiService: AaiService,
+              private _basicPopupService : BasicPopupService,
+              private _store: NgRedux<AppState>) {
+  }
+
+  getInstance(serviceId: string, networkName: string, networkStoreKey: string): any {
+    if (_.isNil(networkStoreKey)) {
+      return new NetworkInstance();
+    }
+    return this._store.getState().service.serviceInstance[serviceId].networks[networkStoreKey];
+  }
+
+  getGenericFormPopupDetails(serviceId: string, networkName: string, networkStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
+    this.uuidData = uuidData;
+    this.instance = this.getInstance(serviceId, networkName, networkStoreKey);
+
+
+    this.getModelInformation(serviceId, networkName);
+
+    return new FormPopupDetails(this,
+      PopupType.NETWORK_MACRO,
+      uuidData,
+      this.getTitle(isUpdateMode),
+      this.getSubLeftTitle(),
+      this.getSubRightTitle(),
+      this.getControls(serviceId, networkName, networkStoreKey, isUpdateMode),
+      this._basicPopupService.getDynamicInputs(serviceId,networkName, networkStoreKey, 'networks'),
+      this.modelInformations,
+      (that, form: FormGroup) => {that.onSubmit(that, form);},
+      (that: any, form: FormGroup) => {that.onCancel(that, form); }
+    );
+  }
+
+  getModelInformation(serviceId: string, networkName: string) {
+    this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
+      this.serviceModel = new ServiceModel(result);
+      this.model = this._basicPopupService.getModelFromResponse(result, 'networks', networkName);
+
+      const serviceInstance = this._store.getState().service.serviceInstance[serviceId];
+      this.modelInformations = [
+        new ModelInformationItem("Subscriber Name", "subscriberName", [this._basicPopupService.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]),
+        new ModelInformationItem("Network roles", "network-role", this.model.roles, "", false)
+      ];
+    });
+  }
+
+  getControls(serviceId: string, networkName: string, networkStoreKey: string, isUpdateMode: boolean) {
+    if (this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') {
+      return this._networkControlGenerator.getMacroFormControls(serviceId, networkStoreKey, networkName, isUpdateMode);
+    } else {
+      return this._networkControlGenerator.getAlaCarteFormControls(serviceId, networkStoreKey, networkName, isUpdateMode);
+    }
+  }
+
+
+  onSubmit(that, form: FormGroup) {
+    form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']];
+    that.storeNetwork(that, form.value);
+    window.parent.postMessage({
+      eventId: 'submitIframe',
+      data: {
+        serviceModelId: that.serviceModel.uuid
+      }
+    }, "*");
+    this.onCancel(that, form);
+  }
+
+
+  onCancel(that, form) {
+    form.reset();
+    that._iframeService.removeClassCloseModal('content');
+    this.closeDialogEvent.next(that);
+  }
+
+  storeNetwork = (that, formValues: any): void => {
+    formValues.modelInfo = new ModelInfo(that.model);
+    formValues.uuid = formValues.modelInfo.uuid;
+    formValues.isMissingData = false;
+
+    if (!that.uuidData.networkStoreKey) {
+      this._store.dispatch(changeInstanceCounter(formValues.modelInfo.modelUniqueId , that.uuidData.serviceId, 1, <any>{data: {type: 'Network'}}));
+      this._store.dispatch(createNetworkInstance(formValues, that.uuidData.networkId, that.uuidData.serviceId, that.uuidData.networkId));
+    } else {
+      this._store.dispatch(updateNetworkInstance(formValues, that.uuidData.networkId, that.uuidData.serviceId, that.uuidData.networkStoreKey));
+    }
+  };
+
+
+  getTitle(isUpdateMode : boolean) : string {
+    return isUpdateMode ? 'Edit Network' : 'Set new Network';
+  }
+
+  getSubLeftTitle(): string {
+    return this.uuidData['networkId'];
+  }
+
+  getSubRightTitle(): string {
+    return "Network Instance Details";
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.spec.ts
new file mode 100644 (file)
index 0000000..64f47a3
--- /dev/null
@@ -0,0 +1,2439 @@
+import {LogService} from "../../../../utils/log/log.service";
+import {ReflectiveInjector} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {HttpClient} from "@angular/common/http";
+import {GenericFormService} from "../../../genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {ServicePopupService} from "./service.popup.service";
+import {ServiceControlGenerator} from "../../../genericForm/formControlsServices/service.control.generator";
+import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
+import {SdcUiServices} from "onap-ui-angular";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockModalService<T> {}
+
+class MockAppStore<T> {}
+
+class MockReduxStore<T> {
+  getState() {
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "FLAG_ADVANCED_PORTS_FILTER": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+          "FLAG_REGION_ID_FROM_REMOTE": true,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": "Emanuel",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "ComplexService",
+              "serviceEcompNaming": "false",
+              "instantiationType": "Macro",
+              "inputs": {
+                "2017488_adiodvpe0_ASN_1": {
+                  "type": "string",
+                  "description": "AV/PE",
+                  "entry_schema": null,
+                  "inputProperties": null,
+                  "constraints": [],
+                  "required": true,
+                  "default": "AV_vPE"
+                },
+                "2017488_adiodvpe0_ASN_2": {
+                  "type": "number",
+                  "description": "AV/PE",
+                  "entry_schema": null,
+                  "inputProperties": null,
+                  "constraints": [],
+                  "required": true,
+                  "default": 2
+                },
+                "2017488_adiodvpe0_ASN_3": {
+                  "type": "string",
+                  "description": "AV/PE",
+                  "entry_schema": null,
+                  "inputProperties": null,
+                  "constraints": [],
+                  "required": false,
+                  "default": "AV_vPE"
+                },
+                "2017488_adiodvpe0_ASN_4": {
+                  "type": "string",
+                  "description": "AV/PE",
+                  "entry_schema": null,
+                  "inputProperties": null,
+                  "constraints": [],
+                  "required": true,
+                  "default": "AV_vPE_123"
+                }
+              }
+            },
+            "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": {
+                  "max_instances": 10,
+                  "min_instances": 1,
+                  "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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": "false",
+                  "sctp-a-IPv6_ethertype": "IPv6",
+                  "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "true",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": true
+                  },
+                  "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": {
+                  "netowrk_role": "role 1, role 2, role 3",
+                  "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": true
+              },
+              "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": {}
+          },
+          "6b528779-44a3-4472-bdff-9cd15ec93450": {
+            "service": {
+              "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+              "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "name": "action-data",
+              "version": "1.0",
+              "toscaModelURL": null,
+              "category": "some category",
+              "serviceType": "some service type",
+              "serviceRole": "some service role",
+              "description": "some description",
+              "serviceEcompNaming": "false",
+              "instantiationType": "A-La-Carte",
+              "inputs": {
+                "2017488_adiodvpe0_ASN_1": {
+                  "type": "string",
+                  "description": "AV/PE",
+                  "entry_schema": null,
+                  "inputProperties": null,
+                  "constraints": [],
+                  "required": true,
+                  "default": "AV_vPE"
+                },
+                "2017488_adiodvpe0_ASN_2": {
+                  "type": "number",
+                  "description": "AV/PE",
+                  "entry_schema": null,
+                  "inputProperties": null,
+                  "constraints": [],
+                  "required": true,
+                  "default": 2
+                },
+                "2017488_adiodvpe0_ASN_3": {
+                  "type": "string",
+                  "description": "AV/PE",
+                  "entry_schema": null,
+                  "inputProperties": null,
+                  "constraints": [],
+                  "required": false,
+                  "default": "AV_vPE"
+                },
+                "2017488_adiodvpe0_ASN_4": {
+                  "type": "string",
+                  "description": "AV/PE",
+                  "entry_schema": null,
+                  "inputProperties": null,
+                  "constraints": [],
+                  "required": true,
+                  "default": "AV_vPE_123"
+                }
+              }
+            },
+            "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,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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",
+                  "min_instances": "1",
+                  "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                  "vf_module_id": "123",
+                  "nf_function": "JAI",
+                  "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                  "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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",
+                  "max_instances": "3",
+                  "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",
+                  "min_instances": "1",
+                  "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                  "vf_module_id": "123",
+                  "nf_function": "JAI",
+                  "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                  "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {
+              "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "mtnj309me6"
+                  }
+                },
+                "commands": {},
+                "properties": {
+                  "network_role" : "network role 1, network role 2",
+                  "min_instances": 1,
+                  "max_instances": 10,
+                  "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": {},
+            "fabricConfigurations": {},
+            "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": {
+          "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+            "vnfs": {
+              "VF_vMee 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "vf_vmee0..VfVmee..base_vmme..module-0": {
+                    "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+                      "isMissingData": false,
+                      "sdncPreReload": null,
+                      "modelInfo": {
+                        "modelType": "VFmodule",
+                        "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+                        "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+                        "modelName": "VfVmee..base_vmme..module-0",
+                        "modelVersion": "2",
+                        "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                        "modelCustomizationName": "VfVmee..base_vmme..module-0"
+                      },
+                      "instanceParams": [{}],
+                      "trackById": "wmtm6sy2uj"
+                    }
+                  }
+                },
+                "isMissingData": true,
+                "originalName": "VF_vMee 0",
+                "vnfStoreKey": "VF_vMee 0",
+                "trackById": "p3wk448m5do",
+                "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+                "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+                "lcpCloudRegionId": null,
+                "tenantId": null,
+                "lineOfBusiness": null,
+                "platformName": null,
+                "modelInfo": {
+                  "modelType": "VF",
+                  "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+                  "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+                  "modelName": "VF_vMee",
+                  "modelVersion": "2.0",
+                  "modelCustomizationName": "VF_vMee 0"
+                }
+              }
+            },
+            "networks": {},
+            "instanceParams": [{}],
+            "validationCounter": 1,
+            "existingNames": {},
+            "existingVNFCounterMap": {"d6557200-ecf2-4641-8094-5393ae3aae60": 1},
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "lcpCloudRegionId": "hvf6",
+            "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "aicZoneId": "JAG1",
+            "projectName": "x1",
+            "rollbackOnFailure": "true",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "modelName": "ComplexService",
+              "modelVersion": "1.0",
+              "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+            },
+            "isALaCarte": false,
+            "name": "ComplexService",
+            "version": "1.0",
+            "description": "ComplexService",
+            "category": "Emanuel",
+            "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isMultiStepDesign": false
+          },
+          "6b528779-44a3-4472-bdff-9cd15ec93450": {
+            "networks": {
+              "ExtVL 0": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0",
+                "trackById": "sf3zth68xjf",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [{}],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              },
+              "ExtVL 0:0001": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0",
+                "trackById": "2mdxioxca9h",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [{}],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              },
+              "ExtVL 0_1": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0_1",
+                "trackById": "z7vd1gmpbs",
+                "instanceName": "ExtVL",
+                "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "zzz1",
+                "instanceParams": [{
+                  "vnf_config_template_version": "17.2",
+                  "bandwidth_units": "Gbps",
+                  "bandwidth": "10",
+                  "AIC_CLLI": "ATLMY8GA",
+                  "ASN": "AV_vPE",
+                  "vnf_instance_name": "yoav"
+                }],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              }
+            },
+            "vnfs": {
+              "2017-488_ADIOD-vPE 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+                      "instanceName": "yoav",
+                      "volumeGroupName": "123",
+                      "modelInfo": {
+                        "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                        "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                        "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                        "modelVersion": "6",
+                        "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                        "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                        "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                      },
+                      "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                      "isMissingData": false,
+                      "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"
+                      }]
+                    }
+                  }
+                },
+                "isMissingData": false,
+                "originalName": "2017-488_ADIOD-vPE 0",
+                "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+                "trackById": "o65b26t2thj",
+                "instanceName": "2017488_ADIODvPE",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "platformName": "platform",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [{}],
+                "modelInfo": {
+                  "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",
+                  "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+                },
+                "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+              }
+            },
+            "instanceParams": [{"2017488_adiodvpe0_ASN": "AV_vPE"}],
+            "validationCounter": 0,
+            "existingNames": {"123": "", "instancename": "", "yoav": "", "extvl": ""},
+            "existingVNFCounterMap": {"69e09f68-8b63-4cc9-b9ff-860960b5db09": 1},
+            "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 3},
+            "instanceName": "InstanceName",
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "aicZoneId": "JAG1",
+            "projectName": null,
+            "rollbackOnFailure": "true",
+            "aicZoneName": "YUDFJULP-JAG1",
+            "owningEntityName": "WayneHolland",
+            "testApi": "GR_API",
+            "tenantName": "USP-SIP-IC-24335-T-01",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+              "modelName": "action-data",
+              "modelVersion": "1.0",
+              "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+            },
+            "isALaCarte": false,
+            "name": "action-data",
+            "version": "1.0",
+            "description": "",
+            "category": "",
+            "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isMultiStepDesign": false
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [{
+            "id": "JANET25",
+            "name": "JANET25",
+            "isPermitted": true
+          }, {"id": "hvf6", "name": "hvf6", "isPermitted": true}],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [{
+              "id": "092eb9e8e4b7412e8787dd091bc58e86",
+              "name": "USP-SIP-IC-24335-T-01",
+              "isPermitted": true
+            }],
+            "hvf6": [{
+              "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+              "name": "AIN Web Tool-15-D-testalexandria",
+              "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-hvf6-09",
+              "isPermitted": true
+            }, {"id": "cbb99fe4ada84631b7baf046b6fd2044", "name": "DN5242-Nov16-T3", "isPermitted": true}]
+          }
+        },
+        "productFamilies": [{
+          "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+          "name": "SCOTTIE",
+          "isPermitted": true
+        }, {
+          "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+          "name": "IGNACIO",
+          "isPermitted": true
+        }, {
+          "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+          "name": "Christie",
+          "isPermitted": true
+        }, {
+          "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+          "name": "Enhanced Services",
+          "isPermitted": true
+        }, {"id": "vTerrance", "name": "vTerrance", "isPermitted": true}, {
+          "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+          "name": "vSCP",
+          "isPermitted": true
+        }, {
+          "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+          "name": "Emanuel",
+          "isPermitted": true
+        }, {
+          "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+          "name": "BVOIP",
+          "isPermitted": true
+        }, {"id": "db171b8f-115c-4992-a2e3-ee04cae357e0", "name": "LINDSEY", "isPermitted": true}, {
+          "id": "LRSI-OSPF",
+          "name": "LRSI-OSPF",
+          "isPermitted": true
+        }, {"id": "vRosemarie", "name": "HNGATEWAY", "isPermitted": true}, {
+          "id": "vHNPaas",
+          "name": "WILKINS",
+          "isPermitted": true
+        }, {
+          "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "name": "TYLER SILVIA",
+          "isPermitted": true
+        }, {"id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", "name": "VROUTER", "isPermitted": true}, {
+          "id": "Cisneros",
+          "name": "vMuriel",
+          "isPermitted": true
+        }, {
+          "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+          "name": "CARA Griffin",
+          "isPermitted": true
+        }, {
+          "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+          "name": "DARREN MCGEE",
+          "isPermitted": true
+        }, {"id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", "name": "Transport", "isPermitted": true}, {
+          "id": "vSalvatore",
+          "name": "vSalvatore",
+          "isPermitted": true
+        }, {"id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", "name": "Josefina", "isPermitted": true}, {
+          "id": "vHubbard",
+          "name": "vHubbard",
+          "isPermitted": true
+        }, {"id": "12a96a9d-4b4c-4349-a950-fe1159602621", "name": "DARREN MCGEE", "isPermitted": true}],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [{
+            "id": "0",
+            "name": "vRichardson",
+            "isPermitted": false
+          }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, {
+            "id": "2",
+            "name": "Emanuel",
+            "isPermitted": false
+          }, {"id": "3", "name": "vJamie", "isPermitted": false}, {
+            "id": "4",
+            "name": "vVoiceMail",
+            "isPermitted": false
+          }, {"id": "5", "name": "Kennedy", "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": "LINDSEY",
+            "isPermitted": false
+          }, {"id": "17", "name": "JOHANNA_SANTOS", "isPermitted": false}, {
+            "id": "18",
+            "name": "vCarroll",
+            "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": "WayneHolland"}, {
+            "id": "Melissa",
+            "name": "Melissa"
+          }],
+          "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}],
+          "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}],
+          "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}]
+        },
+        "type": "[LCP_REGIONS_AND_TENANTS] Update",
+        "subscribers": [{
+          "id": "CAR_2020_ER",
+          "name": "CAR_2020_ER",
+          "isPermitted": true
+        }, {
+          "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+          "name": "JULIO ERICKSON",
+          "isPermitted": false
+        }, {
+          "id": "DHV1707-TestSubscriber-2",
+          "name": "DALE BRIDGES",
+          "isPermitted": false
+        }, {"id": "DHV1707-TestSubscriber-1", "name": "LLOYD BRIDGES", "isPermitted": false}, {
+          "id": "jimmy-example",
+          "name": "JimmyExampleCust-20161102",
+          "isPermitted": false
+        }, {
+          "id": "jimmy-example2",
+          "name": "JimmyExampleCust-20161103",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-TestSub-PWT-102",
+          "name": "ERICA5779-TestSub-PWT-102",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-TestSub-PWT-101",
+          "name": "ERICA5779-TestSub-PWT-101",
+          "isPermitted": false
+        }, {
+          "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+          "name": "Emanuel",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-Subscriber-4",
+          "name": "ERICA5779-Subscriber-5",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-TestSub-PWT-103",
+          "name": "ERICA5779-TestSub-PWT-103",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-Subscriber-2",
+          "name": "ERICA5779-Subscriber-2",
+          "isPermitted": false
+        }, {
+          "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "name": "SILVIA ROBBINS",
+          "isPermitted": true
+        }, {
+          "id": "ERICA5779-Subscriber-3",
+          "name": "ERICA5779-Subscriber-3",
+          "isPermitted": false
+        }, {"id": "31739f3e-526b-11e6-beb8-9e71128cae77", "name": "CRAIG/ROBERTS", "isPermitted": false}]
+      }
+    };
+  }
+}
+
+class MockFeatureFlagsService {}
+
+describe('Service popup service', () => {
+  let injector;
+  let service: ServicePopupService;
+  let genericFormService: GenericFormService;
+  let defaultDataGeneratorService: DefaultDataGeneratorService;
+  let fb: FormBuilder;
+  let iframeService: IframeService;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      providers : [
+        ServicePopupService,
+        BasicControlGenerator,
+        ServiceControlGenerator,
+        DefaultDataGeneratorService,
+        GenericFormService,
+        FormBuilder,
+        IframeService,
+        AaiService,
+        LogService,
+        BasicPopupService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        {provide: NgRedux, useClass: MockReduxStore},
+        {provide: HttpClient, useClass: MockAppStore},
+        {provide: SdcUiServices.ModalService, useClass: MockModalService}
+      ]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(ServicePopupService);
+    genericFormService = injector.get(GenericFormService);
+    defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+    fb = injector.get(FormBuilder);
+    iframeService = injector.get(IframeService);
+
+  })().then(done).catch(done.fail));
+
+  test('getTitle should return the correct title for edit and create mode', () => {
+    expect(service.getTitle(true)).toBe('Edit service instance');
+    expect(service.getTitle(false)).toBe('Set a new service instance');
+  });
+
+  test('getSubLeftTitle should return service model name', () => {
+    service.uuidData = {
+      serviceId : '6b528779-44a3-4472-bdff-9cd15ec93450'
+    };
+    expect(service.getSubLeftTitle()).toBe('action-data');
+  });
+
+  test('getSubRightTitle should return popup type', () => {
+    expect(service.getSubRightTitle()).toBe('Service Instance Details');
+  });
+
+  test('getModelInformation should update modelInformations', () => {
+    const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+
+    service.getModelInformation(serviceId);
+    expect(service.modelInformations.length).toEqual(7);
+
+    expect(service.modelInformations[0].label).toEqual("Model version");
+    expect(service.modelInformations[0].values).toEqual(['1.0']);
+
+    expect(service.modelInformations[1].label).toEqual("Description");
+    expect(service.modelInformations[1].values).toEqual(['some description']);
+
+    expect(service.modelInformations[2].label).toEqual("Category");
+    expect(service.modelInformations[2].values).toEqual(['some category']);
+
+    expect(service.modelInformations[3].label).toEqual("UUID");
+    expect(service.modelInformations[3].values).toEqual(['6b528779-44a3-4472-bdff-9cd15ec93450']);
+
+    expect(service.modelInformations[4].label).toEqual("Invariant UUID");
+    expect(service.modelInformations[4].values).toEqual(['e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0']);
+
+    expect(service.modelInformations[5].label).toEqual("Service type");
+    expect(service.modelInformations[5].values).toEqual(['some service type']);
+
+    expect(service.modelInformations[6].label).toEqual("Service role");
+    expect(service.modelInformations[6].values).toEqual(['some service role']);
+  });
+
+
+  test('onCancel should trigger closeDialogEvent and iframe', () => {
+    let that = <any>{
+      parentElementClassName: 'content',
+      _iframeService: iframeService,
+      resetPopupData : () =>{
+
+      }
+    };
+    jest.spyOn(iframeService, 'removeClassCloseModal');
+    jest.spyOn(service.closeDialogEvent, 'next');
+    service.onCancel(that, fb.group({}));
+
+    expect(that._iframeService.removeClassCloseModal).toHaveBeenCalledWith(that.parentElementClassName)
+    expect(service.closeDialogEvent.next).toHaveBeenCalledWith(that);
+  });
+
+
+  test('getDynamicInputs should return list of controls' ,() => {
+    const result:  FormControlModel[] = service.getDynamicInputs('6b528779-44a3-4472-bdff-9cd15ec93450');
+    console.log(result);
+    expect(result.length).toEqual(4);
+    expect(result[0].controlName).toEqual('2017488_adiodvpe0_ASN_1');
+    expect(result[1].controlName).toEqual('2017488_adiodvpe0_ASN_2');
+    expect(result[2].controlName).toEqual('2017488_adiodvpe0_ASN_3');
+    expect(result[3].controlName).toEqual('2017488_adiodvpe0_ASN_4');
+
+    expect(result[0].dataTestId).toEqual('2017488_adiodvpe0_ASN_1');
+    expect(result[1].dataTestId).toEqual('2017488_adiodvpe0_ASN_2');
+    expect(result[2].dataTestId).toEqual('2017488_adiodvpe0_ASN_3');
+    expect(result[3].dataTestId).toEqual('2017488_adiodvpe0_ASN_4');
+
+    expect(result[0].validations.length).toEqual(1);
+    expect(result[1].validations.length).toEqual(1);
+    expect(result[2].validations.length).toEqual(0);
+    expect(result[3].validations.length).toEqual(1);
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.ts
new file mode 100644 (file)
index 0000000..dc83083
--- /dev/null
@@ -0,0 +1,184 @@
+import {Injectable} from "@angular/core";
+import {GenericPopupInterface} from "../generic-popup.interface";
+import {ServiceModel} from "../../../../models/serviceModel";
+import {ModelInformationItem} from "../../../model-information/model-information.component";
+import {Subject} from "rxjs";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../store/reducers";
+import {ServiceControlGenerator} from "../../../genericForm/formControlsServices/service.control.generator";
+import {FormGroup} from "@angular/forms";
+import {Constants} from "../../../../utils/constants";
+import {ServiceInstance} from "../../../../models/serviceInstance";
+import {ModelInfo} from "../../../../models/modelInfo";
+import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
+import {
+  ServiceActions,
+  createServiceInstance,
+  updateServiceInstance
+} from "../../../../storeUtil/utils/service/service.actions";
+import {ServiceInstanceActions} from "../../../../models/serviceInstanceActions";
+import * as _ from 'lodash';
+@Injectable()
+export class ServicePopupService implements GenericPopupInterface {
+  dynamicInputs: any;
+  instance: any;
+  model: any;
+  serviceModel: ServiceModel;
+  modelInformations: ModelInformationItem[] = [];
+  uuidData: Object;
+  closeDialogEvent: Subject<any> = new Subject<any>();
+  isUpdateMode: boolean;
+
+
+
+  constructor(private _basicControlGenerator: BasicControlGenerator,
+              private _serviceControlGenerator: ServiceControlGenerator,
+              private _iframeService: IframeService,
+              private _defaultDataGeneratorService: DefaultDataGeneratorService,
+              private _aaiService: AaiService,
+              private _basicPopupService : BasicPopupService,
+              private _store: NgRedux<AppState>) {
+
+  }
+
+  getGenericFormPopupDetails(serviceId: string, modelName: string, storeKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
+    this.uuidData = uuidData;
+    this.instance = this.getInstance(serviceId);
+    this.getModelInformation(serviceId);
+    return new FormPopupDetails(this,
+      PopupType.SERVICE,
+      uuidData,
+      this.getTitle(isUpdateMode),
+      this.getSubLeftTitle(),
+      this.getSubRightTitle(),
+      this.getControls(serviceId),
+      this.getDynamicInputs(serviceId),
+      this.modelInformations,
+      (that, form: FormGroup) => {that.onSubmit(that, form);},
+      (that: any, form: FormGroup) => {that.onCancel(that, form); }
+    );
+  }
+
+  getDynamicInputs(serviceId) : FormControlModel[]{
+    let dynamic = this._defaultDataGeneratorService.getArbitraryInputs(this._store.getState().service.serviceHierarchy[serviceId].service.inputs);
+    return this._basicControlGenerator.getServiceDynamicInputs(dynamic, serviceId);
+  }
+
+
+  getControls(serviceId: string) {
+    if(this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') {
+      return this._serviceControlGenerator.getMacroFormControls(serviceId, this.dynamicInputs);
+    }else {
+      return this._serviceControlGenerator.getAlaCartControls(serviceId, this.dynamicInputs);
+    }
+  }
+
+  getInstance(serviceId): ServiceInstance {
+    let result: ServiceInstance = null;
+    if(!_.isNil(this._store.getState().service.serviceInstance[serviceId])){
+      result = this._store.getState().service.serviceInstance[serviceId];
+    }
+    return result;
+  }
+
+  getModelInformation(serviceId: string): void {
+    this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
+      this.serviceModel = new ServiceModel(result);
+
+      this.model = this._store.getState().service.serviceHierarchy[serviceId];
+      this.modelInformations = [
+          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])
+      ];
+    });
+  }
+
+  getSubLeftTitle(): string {
+    return this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].service.name;
+  }
+
+  getSubRightTitle(): string {
+    return "Service Instance Details";
+  }
+
+  getTitle(isUpdateMode: boolean): string {
+    return isUpdateMode ? "Edit service instance" :  "Set a new service instance";
+  }
+
+  onCancel(that, form): void {
+    form.reset();
+    that._iframeService.removeClassCloseModal('content');
+    this.closeDialogEvent.next(that);
+  }
+
+  onSubmit(that, form: FormGroup, ...args): void {
+    form = that.updateExtraValues(that, form);
+    that.storeServiceInstance(form.value, args[0], [], new ModelInfo(that.serviceModel), that.serviceModel);
+    window.parent.postMessage( {
+      eventId: 'submitIframe',
+      data: {
+        serviceModelId: that.serviceModel.uuid
+      }
+    }, "*");
+    this.onCancel(that, form);
+  }
+
+  updateExtraValues = (that, form) : any => {
+    const service = that._store.getState().service;
+    form.value['bulkSize'] = that.uuidData['bulkSize'];
+    form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']];
+    form.value['aicZoneName'] = !_.isNil(form.value['aicZoneId']) ?this.getNameFromListById(service.aicZones, form.value['aicZoneId']) : null;
+    form.value['owningEntityName'] = !_.isNil(form.value['owningEntityId']) ?this.getNameFromListById(service.categoryParameters.owningEntityList, form.value['owningEntityId']) : null;
+    form.value['testApi'] = sessionStorage.getItem("msoRequestParametersTestApiValue");
+    form.value['tenantName'] = this.getNameFromListById(service.lcpRegionsAndTenants.lcpRegionsTenantsMap[form.value['lcpCloudRegionId']], form.value['tenantId']);
+    return form;
+  };
+
+  getNameFromListById(list, id) {
+    if(list && id) {
+      return list.find(item => item.id === id).name;
+    }
+    return null;
+  }
+
+  storeServiceInstance = (formValues:any, servicesQty:number, dynamicInputs:any, serviceModel:ModelInfo, serviceDetails: any ) => {
+    formValues.bulkSize = this.uuidData['bulkSize'];
+    formValues.modelInfo = serviceModel;
+    let instantiationType = this._store.getState().service.serviceHierarchy[serviceModel.modelVersionId].service.instantiationType;
+    this.setIsALaCarte(formValues, instantiationType);
+    this.setTestApi(formValues);
+    Object.assign(formValues, serviceDetails);
+    let isCreateMode: boolean = this._store.getState().service.serviceInstance[serviceModel.modelVersionId] == null;
+    if(isCreateMode){
+      this._store.dispatch(createServiceInstance(formValues, serviceModel.modelVersionId));
+    }else {
+      this._store.dispatch(updateServiceInstance(formValues, serviceModel.modelVersionId));
+    }
+
+    if (this._store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD'] && isCreateMode) {
+      this._defaultDataGeneratorService.updateReduxOnFirstSet(serviceModel.modelVersionId, formValues);
+    }
+  };
+
+  setIsALaCarte = (formValues: any, instantiationType) => {
+    formValues.isALaCarte = instantiationType === 'A-La-Carte';
+  };
+
+  setTestApi = (formValues: any) =>{
+    if (this._store.getState().global.flags['FLAG_ADD_MSO_TESTAPI_FIELD'] && formValues.isAlaCarte) {
+      formValues.testApi = sessionStorage.getItem("msoRequestParametersTestApiValue");
+    }
+  };
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.spec.ts
new file mode 100644 (file)
index 0000000..3794707
--- /dev/null
@@ -0,0 +1,2407 @@
+import {LogService} from "../../../../utils/log/log.service";
+import {NgRedux} from "@angular-redux/store";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {HttpClient} from "@angular/common/http";
+import {GenericFormService} from "../../../genericForm/generic-form.service";
+import {FormBuilder} from "@angular/forms";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {VfModulePopuopService} from "./vfModule.popuop.service";
+import {VfModuleControlGenerator} from "../../../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {SdcUiServices} from "onap-ui-angular";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockModalService<T> {}
+
+class MockAppStore<T> {}
+
+class MockReduxStore<T> {
+  getState() {
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "FLAG_ADVANCED_PORTS_FILTER": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+          "FLAG_REGION_ID_FROM_REMOTE": true,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": "Emanuel",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "ComplexService",
+              "serviceEcompNaming": "false",
+              "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": {
+                  "max_instances": 10,
+                  "min_instances": 1,
+                  "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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": "false",
+                  "sctp-a-IPv6_ethertype": "IPv6",
+                  "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "true",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": true
+                  },
+                  "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": {
+                  "netowrk_role": "role 1, role 2, role 3",
+                  "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": true
+              },
+              "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": {}
+          },
+          "6b528779-44a3-4472-bdff-9cd15ec93450": {
+            "service": {
+              "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+              "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "name": "action-data",
+              "version": "1.0",
+              "toscaModelURL": null,
+              "category": "",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "",
+              "serviceEcompNaming": "false",
+              "instantiationType": "A-La-Carte",
+              "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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",
+                  "min_instances": "1",
+                  "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                  "vf_module_id": "123",
+                  "nf_function": "JAI",
+                  "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                  "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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",
+                  "max_instances": "3",
+                  "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",
+                  "min_instances": "1",
+                  "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                  "vf_module_id": "123",
+                  "nf_function": "JAI",
+                  "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                  "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {
+              "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "mtnj309me6"
+                  }
+                },
+                "commands": {},
+                "properties": {
+                  "network_role" : "network role 1, network role 2",
+                  "min_instances": 1,
+                  "max_instances": 10,
+                  "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": {},
+            "fabricConfigurations": {},
+            "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": {
+          "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+            "vnfs": {
+              "VF_vMee 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "vf_vmee0..VfVmee..base_vmme..module-0": {
+                    "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+                      "isMissingData": false,
+                      "sdncPreReload": null,
+                      "modelInfo": {
+                        "modelType": "VFmodule",
+                        "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+                        "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+                        "modelName": "VfVmee..base_vmme..module-0",
+                        "modelVersion": "2",
+                        "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                        "modelCustomizationName": "VfVmee..base_vmme..module-0"
+                      },
+                      "instanceParams": [{}],
+                      "trackById": "wmtm6sy2uj"
+                    }
+                  }
+                },
+                "isMissingData": true,
+                "originalName": "VF_vMee 0",
+                "vnfStoreKey": "VF_vMee 0",
+                "trackById": "p3wk448m5do",
+                "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+                "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+                "lcpCloudRegionId": null,
+                "tenantId": null,
+                "lineOfBusiness": null,
+                "platformName": null,
+                "modelInfo": {
+                  "modelType": "VF",
+                  "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+                  "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+                  "modelName": "VF_vMee",
+                  "modelVersion": "2.0",
+                  "modelCustomizationName": "VF_vMee 0"
+                }
+              }
+            },
+            "networks": {},
+            "instanceParams": [{}],
+            "validationCounter": 1,
+            "existingNames": {},
+            "existingVNFCounterMap": {"d6557200-ecf2-4641-8094-5393ae3aae60": 1},
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "lcpCloudRegionId": "hvf6",
+            "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "aicZoneId": "JAG1",
+            "projectName": "x1",
+            "rollbackOnFailure": "true",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "modelName": "ComplexService",
+              "modelVersion": "1.0",
+              "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+            },
+            "isALaCarte": false,
+            "name": "ComplexService",
+            "version": "1.0",
+            "description": "ComplexService",
+            "category": "Emanuel",
+            "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isMultiStepDesign": false
+          },
+          "6b528779-44a3-4472-bdff-9cd15ec93450": {
+            "networks": {
+              "ExtVL 0": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0",
+                "trackById": "sf3zth68xjf",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [{}],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              },
+              "ExtVL 0:0001": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0",
+                "trackById": "2mdxioxca9h",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [{}],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              },
+              "ExtVL 0_1": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0_1",
+                "trackById": "z7vd1gmpbs",
+                "instanceName": "ExtVL",
+                "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "zzz1",
+                "instanceParams": [{
+                  "vnf_config_template_version": "17.2",
+                  "bandwidth_units": "Gbps",
+                  "bandwidth": "10",
+                  "AIC_CLLI": "ATLMY8GA",
+                  "ASN": "AV_vPE",
+                  "vnf_instance_name": "yoav"
+                }],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              }
+            },
+            "vnfs": {
+              "2017-488_ADIOD-vPE 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+                      "instanceName": "yoav",
+                      "volumeGroupName": "123",
+                      "modelInfo": {
+                        "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                        "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                        "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                        "modelVersion": "6",
+                        "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                        "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                        "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                      },
+                      "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                      "isMissingData": false,
+                      "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"
+                      }]
+                    }
+                  }
+                },
+                "isMissingData": false,
+                "originalName": "2017-488_ADIOD-vPE 0",
+                "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+                "trackById": "o65b26t2thj",
+                "instanceName": "2017488_ADIODvPE",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "platformName": "platform",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [{}],
+                "modelInfo": {
+                  "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",
+                  "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+                },
+                "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+              }
+            },
+            "instanceParams": [{"2017488_adiodvpe0_ASN": "AV_vPE"}],
+            "validationCounter": 0,
+            "existingNames": {"123": "", "instancename": "", "yoav": "", "extvl": ""},
+            "existingVNFCounterMap": {"69e09f68-8b63-4cc9-b9ff-860960b5db09": 1},
+            "existingNetworksCounterMap": {"ddc3f20c-08b5-40fd-af72-c6d14636b986": 3},
+            "instanceName": "InstanceName",
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "aicZoneId": "JAG1",
+            "projectName": null,
+            "rollbackOnFailure": "true",
+            "aicZoneName": "YUDFJULP-JAG1",
+            "owningEntityName": "WayneHolland",
+            "testApi": "GR_API",
+            "tenantName": "USP-SIP-IC-24335-T-01",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+              "modelName": "action-data",
+              "modelVersion": "1.0",
+              "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+            },
+            "isALaCarte": false,
+            "name": "action-data",
+            "version": "1.0",
+            "description": "",
+            "category": "",
+            "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isMultiStepDesign": false
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [{
+            "id": "JANET25",
+            "name": "JANET25",
+            "isPermitted": true
+          }, {"id": "hvf6", "name": "hvf6", "isPermitted": true}],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [{
+              "id": "092eb9e8e4b7412e8787dd091bc58e86",
+              "name": "USP-SIP-IC-24335-T-01",
+              "isPermitted": true
+            }],
+            "hvf6": [{
+              "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+              "name": "AIN Web Tool-15-D-testalexandria",
+              "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-hvf6-09",
+              "isPermitted": true
+            }, {"id": "cbb99fe4ada84631b7baf046b6fd2044", "name": "DN5242-Nov16-T3", "isPermitted": true}]
+          }
+        },
+        "productFamilies": [{
+          "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+          "name": "SCOTTIE",
+          "isPermitted": true
+        }, {
+          "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+          "name": "IGNACIO",
+          "isPermitted": true
+        }, {
+          "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+          "name": "Christie",
+          "isPermitted": true
+        }, {
+          "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+          "name": "Enhanced Services",
+          "isPermitted": true
+        }, {"id": "vTerrance", "name": "vTerrance", "isPermitted": true}, {
+          "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+          "name": "vSCP",
+          "isPermitted": true
+        }, {
+          "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+          "name": "Emanuel",
+          "isPermitted": true
+        }, {
+          "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+          "name": "BVOIP",
+          "isPermitted": true
+        }, {"id": "db171b8f-115c-4992-a2e3-ee04cae357e0", "name": "LINDSEY", "isPermitted": true}, {
+          "id": "LRSI-OSPF",
+          "name": "LRSI-OSPF",
+          "isPermitted": true
+        }, {"id": "vRosemarie", "name": "HNGATEWAY", "isPermitted": true}, {
+          "id": "vHNPaas",
+          "name": "WILKINS",
+          "isPermitted": true
+        }, {
+          "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "name": "TYLER SILVIA",
+          "isPermitted": true
+        }, {"id": "b6a3f28c-eebf-494c-a900-055cc7c874ce", "name": "VROUTER", "isPermitted": true}, {
+          "id": "Cisneros",
+          "name": "vMuriel",
+          "isPermitted": true
+        }, {
+          "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+          "name": "CARA Griffin",
+          "isPermitted": true
+        }, {
+          "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+          "name": "DARREN MCGEE",
+          "isPermitted": true
+        }, {"id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1", "name": "Transport", "isPermitted": true}, {
+          "id": "vSalvatore",
+          "name": "vSalvatore",
+          "isPermitted": true
+        }, {"id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4", "name": "Josefina", "isPermitted": true}, {
+          "id": "vHubbard",
+          "name": "vHubbard",
+          "isPermitted": true
+        }, {"id": "12a96a9d-4b4c-4349-a950-fe1159602621", "name": "DARREN MCGEE", "isPermitted": true}],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [{
+            "id": "0",
+            "name": "vRichardson",
+            "isPermitted": false
+          }, {"id": "1", "name": "TYLER SILVIA", "isPermitted": true}, {
+            "id": "2",
+            "name": "Emanuel",
+            "isPermitted": false
+          }, {"id": "3", "name": "vJamie", "isPermitted": false}, {
+            "id": "4",
+            "name": "vVoiceMail",
+            "isPermitted": false
+          }, {"id": "5", "name": "Kennedy", "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": "LINDSEY",
+            "isPermitted": false
+          }, {"id": "17", "name": "JOHANNA_SANTOS", "isPermitted": false}, {
+            "id": "18",
+            "name": "vCarroll",
+            "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": "WayneHolland"}, {
+            "id": "Melissa",
+            "name": "Melissa"
+          }],
+          "projectList": [{"id": "WATKINS", "name": "WATKINS"}, {"id": "x1", "name": "x1"}, {"id": "yyy1", "name": "yyy1"}],
+          "lineOfBusinessList": [{"id": "ONAP", "name": "ONAP"}, {"id": "zzz1", "name": "zzz1"}],
+          "platformList": [{"id": "platform", "name": "platform"}, {"id": "xxx1", "name": "xxx1"}]
+        },
+        "type": "[LCP_REGIONS_AND_TENANTS] Update",
+        "subscribers": [{
+          "id": "CAR_2020_ER",
+          "name": "CAR_2020_ER",
+          "isPermitted": true
+        }, {
+          "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+          "name": "JULIO ERICKSON",
+          "isPermitted": false
+        }, {
+          "id": "DHV1707-TestSubscriber-2",
+          "name": "DALE BRIDGES",
+          "isPermitted": false
+        }, {"id": "DHV1707-TestSubscriber-1", "name": "LLOYD BRIDGES", "isPermitted": false}, {
+          "id": "jimmy-example",
+          "name": "JimmyExampleCust-20161102",
+          "isPermitted": false
+        }, {
+          "id": "jimmy-example2",
+          "name": "JimmyExampleCust-20161103",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-TestSub-PWT-102",
+          "name": "ERICA5779-TestSub-PWT-102",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-TestSub-PWT-101",
+          "name": "ERICA5779-TestSub-PWT-101",
+          "isPermitted": false
+        }, {
+          "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+          "name": "Emanuel",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-Subscriber-4",
+          "name": "ERICA5779-Subscriber-5",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-TestSub-PWT-103",
+          "name": "ERICA5779-TestSub-PWT-103",
+          "isPermitted": false
+        }, {
+          "id": "ERICA5779-Subscriber-2",
+          "name": "ERICA5779-Subscriber-2",
+          "isPermitted": false
+        }, {
+          "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "name": "SILVIA ROBBINS",
+          "isPermitted": true
+        }, {
+          "id": "ERICA5779-Subscriber-3",
+          "name": "ERICA5779-Subscriber-3",
+          "isPermitted": false
+        }, {"id": "31739f3e-526b-11e6-beb8-9e71128cae77", "name": "CRAIG/ROBERTS", "isPermitted": false}]
+      }
+    };
+  }
+}
+
+class MockFeatureFlagsService {}
+
+describe('VFModule popup service', () => {
+  let injector;
+  let service: VfModulePopuopService;
+  let genericFormService: GenericFormService
+  let defaultDataGeneratorService: DefaultDataGeneratorService;
+  let fb: FormBuilder;
+  let iframeService: IframeService;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      providers : [
+        VfModulePopuopService,
+        BasicControlGenerator,
+        VfModuleControlGenerator,
+        DefaultDataGeneratorService,
+        GenericFormService,
+        FormBuilder,
+        IframeService,
+        AaiService,
+        LogService,
+        BasicPopupService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        {provide: NgRedux, useClass: MockReduxStore},
+        {provide: HttpClient, useClass: MockAppStore},
+        {provide: SdcUiServices.ModalService, useClass: MockModalService}
+      ]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(VfModulePopuopService);
+    genericFormService = injector.get(GenericFormService);
+    defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+    fb = injector.get(FormBuilder);
+    iframeService = injector.get(IframeService);
+
+  })().then(done).catch(done.fail));
+
+  test('getTitle should return the correct title for edit and create mode', () => {
+    expect(service.getTitle(true)).toBe('Edit Module (Heat stack)');
+    expect(service.getTitle(false)).toBe('Set new Module (Heat stack)');
+  });
+
+  test('getInstance should return new VfModuleInstance', () => {
+    const serviceId : string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const vnfStoreKey = null;
+    const vfModuleStoreKey = "VF_vMee 0";
+    let  VfModuleInstance ;
+    VfModuleInstance = service.getInstance(serviceId, vnfStoreKey, vfModuleStoreKey);
+    expect (VfModuleInstance).toBeDefined();
+  });
+
+  test('getSubLeftTitle should return network model name', () => {
+    service.model = {
+      'name' : 'Model name'
+    };
+    expect(service.getSubLeftTitle()).toBe('Model name');
+  });
+
+  test('getSubRightTitle should return popup type', () => {
+    expect(service.getSubRightTitle()).toBe('Module (Heat stack) Instance Details');
+  });
+
+  test('getModelInformation should update modelInformations', () => {
+    const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const vfModuleModelName: string = '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1';
+
+    service.getModelInformation(serviceId, vfModuleModelName);
+    expect(service.modelInformations.length).toEqual(15);
+    expect(service.modelInformations[0].label).toEqual("Subscriber Name");
+    expect(service.modelInformations[0].values).toEqual(['SILVIA ROBBINS']);
+
+    expect(service.modelInformations[1].label).toEqual("Service Name");
+    expect(service.modelInformations[1].values).toEqual(['action-data']);
+
+    expect(service.modelInformations[2].label).toEqual("Service Instance Name");
+    expect(service.modelInformations[2].values).toEqual(['InstanceName']);
+
+    expect(service.modelInformations[3].label).toEqual("Model Name");
+    expect(service.modelInformations[3].values).toEqual(['2017488AdiodVpe..ADIOD_vRE_BV..module-1']);
+
+    expect(service.modelInformations[4].label).toEqual("Model version");
+    expect(service.modelInformations[4].values).toEqual(['6']);
+
+    expect(service.modelInformations[5].label).toEqual("Description");
+    expect(service.modelInformations[5].values).toEqual([null]);
+
+    expect(service.modelInformations[6].label).toEqual("Category");
+    expect(service.modelInformations[6].values).toEqual([undefined]);
+
+    expect(service.modelInformations[7].label).toEqual("Sub Category");
+    expect(service.modelInformations[7].values).toEqual([undefined]);
+
+    expect(service.modelInformations[8].label).toEqual("UUID");
+    expect(service.modelInformations[8].values).toEqual(['25284168-24bb-4698-8cb4-3f509146eca5']);
+
+    expect(service.modelInformations[9].label).toEqual("Invariant UUID");
+    expect(service.modelInformations[9].values).toEqual(['7253ff5c-97f0-4b8b-937c-77aeb4d79aa1']);
+
+    expect(service.modelInformations[10].label).toEqual("Service type");
+    expect(service.modelInformations[10].values).toEqual(['']);
+
+    expect(service.modelInformations[11].label).toEqual("Service role");
+    expect(service.modelInformations[11].values).toEqual(['']);
+
+    expect(service.modelInformations[12].label).toEqual("Minimum to instantiate");
+    expect(service.modelInformations[12].values).toEqual(['0']);
+
+    expect(service.modelInformations[13].label).toEqual("Maximum to instantiate");
+    expect(service.modelInformations[13].values).toEqual(['1']);
+  });
+
+
+  test('onCancel should trigger closeDialogEvent and iframe', () => {
+    let that = <any>{
+      parentElementClassName: 'content',
+      _iframeService: iframeService
+    };
+    jest.spyOn(iframeService, 'removeClassCloseModal');
+    jest.spyOn(service.closeDialogEvent, 'next');
+
+    service.onCancel(that, fb.group({}));
+
+    expect(that._iframeService.removeClassCloseModal).toHaveBeenCalledWith(that.parentElementClassName)
+    expect(service.closeDialogEvent.next).toHaveBeenCalledWith(that);
+  });
+
+  test('onSubmit should trigger onCancel', () => {
+    let that = <any>{
+      parentElementClassName: 'content',
+      _iframeService: iframeService,
+      storeVFModule: () => {
+      },
+      serviceModel: {
+        uuid: 'someUUID'
+      }
+    };
+    let form = fb.group({});
+    jest.spyOn(service, 'onCancel');
+    jest.spyOn(that, 'storeVFModule');
+    jest.spyOn(window.parent, 'postMessage');
+
+    service.onSubmit(that, form);
+
+    expect(service.onCancel).toHaveBeenCalledWith(that, form);
+    expect(that.storeVFModule).toHaveBeenCalledWith(that, form.value);
+    expect(window.parent.postMessage).toHaveBeenCalledWith({
+      eventId: 'submitIframe',
+      data: {
+        serviceModelId: 'someUUID'
+      }
+    }, "*");
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.ts
new file mode 100644 (file)
index 0000000..7563f1d
--- /dev/null
@@ -0,0 +1,184 @@
+import {Injectable} from "@angular/core";
+import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {AppState} from "../../../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {ModelInformationItem} from "../../../model-information/model-information.component";
+import {Constants} from "../../../../utils/constants";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {ServiceModel} from "../../../../models/serviceModel";
+import {FormGroup} from "@angular/forms";
+import {ModelInfo} from "../../../../models/modelInfo";
+import {IframeService} from "../../../../utils/iframe.service";
+import {GenericPopupInterface} from "../generic-popup.interface";
+import {Subject} from "rxjs/Subject";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {VfModuleInstance} from "../../../../models/vfModuleInstance";
+import {VfModuleControlGenerator} from "../../../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
+import * as _ from 'lodash';
+import {createVFModuleInstance, updateVFModuleInstance} from "../../../../storeUtil/utils/vfModule/vfModule.actions";
+
+@Injectable()
+export class VfModulePopuopService implements GenericPopupInterface {
+  dynamicInputs: any;
+  instance: any;
+  model: any;
+  serviceModel: ServiceModel;
+  modelInformations: ModelInformationItem[] = [];
+  uuidData: Object;
+  closeDialogEvent: Subject<any> = new Subject<any>();
+  isUpdateMode: boolean;
+
+
+  constructor(private _basicControlGenerator: BasicControlGenerator,
+              private _vfModuleControlGenerator: VfModuleControlGenerator,
+              private _iframeService: IframeService,
+              private _defaultDataGeneratorService: DefaultDataGeneratorService,
+              private _aaiService: AaiService,
+              private _basicPopupService : BasicPopupService,
+              private _store: NgRedux<AppState>) {
+
+  }
+
+  getInstance(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string): any {
+    if (_.isNil(vnfStoreKey) || _.isNil(vfModuleStoreKey)) {
+      return new VfModuleInstance();
+    }
+    const vfModules = this._store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey].vfModules;
+    return vfModules[this.uuidData['modelName']][vfModuleStoreKey];
+  }
+
+  getDynamicInputs(UUIDData : Object) : FormControlModel[]{
+    let dynamic = this._defaultDataGeneratorService.getArbitraryInputs(this._store.getState().service.serviceHierarchy[UUIDData['serviceId']].vfModules[UUIDData['modelName']].inputs);
+    return this.getVFModuleDynamicInputs(dynamic, UUIDData);
+  }
+
+  getVFModuleDynamicInputs(dynamicInputs : any, UUIDData : Object) : FormControlModel[] {
+    let result : FormControlModel[] = [];
+    if(dynamicInputs) {
+      let vfModuleInstance = null;
+      if (_.has(this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs, UUIDData['vnfStoreKey']) &&
+        _.has(this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs[UUIDData['vnfStoreKey']].vfModules, UUIDData['modelName'])) {
+        vfModuleInstance = Object.assign({},this._store.getState().service.serviceInstance[UUIDData['serviceId']].vnfs[UUIDData['vnfStoreKey']].vfModules[UUIDData['modelName']][UUIDData['vfModuleStoreKey']]);
+      }
+      result = this._basicControlGenerator.getDynamicInputs(dynamicInputs, vfModuleInstance);
+    }
+    return result;
+  }
+
+
+  getGenericFormPopupDetails(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
+
+    this.uuidData = uuidData;
+    this.instance = this.getInstance(serviceId, vnfStoreKey, vfModuleStoreKey);
+    this.getModelInformation(serviceId, uuidData['modelName']);
+
+    return new FormPopupDetails(this,
+      PopupType.VFMODULE,
+      uuidData,
+      this.getTitle(isUpdateMode),
+      this.getSubLeftTitle(),
+      this.getSubRightTitle(),
+      this.getControls(serviceId, vnfStoreKey, vfModuleStoreKey, isUpdateMode),
+      this.getDynamicInputs(uuidData),
+      this.modelInformations,
+      (that, form: FormGroup) => {that.onSubmit(that, form);},
+      (that: any, form: FormGroup) => {that.onCancel(that, form); }
+    );
+  }
+
+  getModelInformation(serviceId: string, modelName: string) {
+    this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
+      this.serviceModel = new ServiceModel(result);
+
+      this.model = this._basicPopupService.getModelFromResponse(result, 'vfModules', modelName);
+      const serviceInstance = this._store.getState().service.serviceInstance[serviceId];
+      this.modelInformations = [
+        new ModelInformationItem("Subscriber Name", "subscriberName", [this._basicPopupService.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]),
+        new ModelInformationItem("Minimum to instantiate", "min", this.model.min == undefined ? ['0'] : [this.model.min.toString()], "", true),
+        new ModelInformationItem("Maximum to instantiate", "max", this.model.max == undefined ? ['1'] : [this.model.max.toString()], "", true),
+        new ModelInformationItem("Recommended to instantiate", "initial", [this.model.initial])
+      ];
+    });
+  }
+
+  getControls(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, isUpdateMode: boolean) {
+    if (this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') {
+      return this._vfModuleControlGenerator.getMacroFormControls(serviceId, vnfStoreKey, vfModuleStoreKey, this.uuidData, isUpdateMode);
+    } else {
+      return this._vfModuleControlGenerator.getAlaCarteFormControls(serviceId, vnfStoreKey, vfModuleStoreKey,  this.uuidData, isUpdateMode);
+    }
+  }
+
+
+  onSubmit(that, form: FormGroup) {
+    form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']];
+    if (!_.isNil(form.controls['supplementaryFile_hidden_content']) && form.controls['supplementaryFile_hidden_content'].value) {
+      form.value['supplementaryFileContent'] = JSON.parse(form.controls['supplementaryFile_hidden_content'].value);
+      if (!_.isNil(form.controls['supplementaryFile_hidden'].value)) {
+        form.value['supplementaryFileName'] = form.controls['supplementaryFile_hidden'].value.name;
+      }
+      else {
+        form.value['supplementaryFileName'] = that.instance.supplementaryFileName;
+      }
+    }
+    else {
+      delete form.value['supplementaryFileContent'];
+      delete form.value['supplementaryFileName'];
+    }
+    that.storeVFModule(that, form.value);
+    window.parent.postMessage({
+      eventId: 'submitIframe',
+      data: {
+        serviceModelId: that.serviceModel.uuid
+      }
+    }, "*");
+    this.onCancel(that, form);
+  }
+
+
+  onCancel(that, form) {
+    form.reset();
+    that._iframeService.removeClassCloseModal('content');
+    this.closeDialogEvent.next(that);
+  }
+
+  storeVFModule = (that, formValues: any): void => {
+    formValues.modelInfo = new ModelInfo(that.model);
+    formValues.uuid = formValues.modelInfo.uuid;
+    formValues.isMissingData = false;
+    const vnf =  that._store.getState().service.serviceInstance[that.uuidData.serviceId].vnfs[that.uuidData.vnfStoreKey];
+
+    if (!that.uuidData.vFModuleStoreKey) {
+      this._store.dispatch(createVFModuleInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, 0, that.uuidData.vnfStoreKey));
+    } else {
+      this._store.dispatch(updateVFModuleInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, that.uuidData.vFModuleStoreKey, that.uuidData.vnfStoreKey));
+    }
+  };
+
+  getTitle(isUpdateMode : boolean) : string {
+    return isUpdateMode ? 'Edit Module (Heat stack)' : 'Set new Module (Heat stack)';
+  }
+
+  getSubLeftTitle(): string {
+    return this.model.name;
+  }
+
+  getSubRightTitle(): string {
+    return "Module (Heat stack) Instance Details";
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.spec.ts
new file mode 100644 (file)
index 0000000..c77c092
--- /dev/null
@@ -0,0 +1,3242 @@
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {NgRedux} from "@angular-redux/store";
+import {ReflectiveInjector} from "@angular/core";
+import {IframeService} from "../../../../utils/iframe.service";
+import {VfModulePopuopService} from "../vfModule/vfModule.popuop.service";
+import {FormBuilder} from "@angular/forms";
+import {GenericFormService} from "../../../genericForm/generic-form.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {LogService} from "../../../../utils/log/log.service";
+import {HttpClient} from "@angular/common/http";
+import {VnfPopupService} from "./vnf.popup.service";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {VnfControlGenerator} from "../../../genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {UUIDData} from "../../generic-form-popup.component";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockAppStore<T> {}
+
+class MockReduxStore<T> {
+  getState() {
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "FLAG_ADVANCED_PORTS_FILTER": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+          "FLAG_REGION_ID_FROM_REMOTE": true,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": "Emanuel",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "ComplexService",
+              "serviceEcompNaming": "false",
+              "instantiationType": "Macro",
+              "inputs": {}
+            },
+            "vnfGroups" : {},
+            "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": {
+                  "max_instances": 10,
+                  "min_instances": 1,
+                  "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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": "false",
+                  "sctp-a-IPv6_ethertype": "IPv6",
+                  "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "true",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": true
+                  },
+                  "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": {
+                  "netowrk_role": "role 1, role 2, role 3",
+                  "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": true
+              },
+              "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": {}
+          },
+          "6b528779-44a3-4472-bdff-9cd15ec93450": {
+            "service": {
+              "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+              "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "name": "action-data",
+              "version": "1.0",
+              "toscaModelURL": null,
+              "category": "",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "",
+              "serviceEcompNaming": "false",
+              "instantiationType": "A-La-Carte",
+              "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": {
+                  "max_instances": 5,
+                  "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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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",
+                  "min_instances": "1",
+                  "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                  "vf_module_id": "123",
+                  "nf_function": "JAI",
+                  "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                  "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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",
+                  "max_instances": "3",
+                  "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",
+                  "min_instances": "1",
+                  "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                  "vf_module_id": "123",
+                  "nf_function": "JAI",
+                  "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                  "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": {}
+              }
+            },
+            "vnfGroups": {},
+            "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "mtnj309me6"
+                  }
+                },
+                "commands": {},
+                "properties": {
+                  "network_role": "network role 1, network role 2",
+                  "min_instances": 1,
+                  "max_instances": 10,
+                  "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": {},
+            "fabricConfigurations": {},
+            "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": {
+          "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+            "vnfs": {
+              "VF_vMee 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "vf_vmee0..VfVmee..base_vmme..module-0": {
+                    "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+                      "isMissingData": false,
+                      "sdncPreReload": null,
+                      "modelInfo": {
+                        "modelType": "VFmodule",
+                        "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+                        "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+                        "modelName": "VfVmee..base_vmme..module-0",
+                        "modelVersion": "2",
+                        "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                        "modelCustomizationName": "VfVmee..base_vmme..module-0"
+                      },
+                      "instanceParams": [
+                        {}
+                      ],
+                      "trackById": "wmtm6sy2uj"
+                    }
+                  }
+                },
+                "isMissingData": true,
+                "originalName": "VF_vMee 0",
+                "vnfStoreKey": "VF_vMee 0",
+                "trackById": "p3wk448m5do",
+                "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+                "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+                "lcpCloudRegionId": null,
+                "tenantId": null,
+                "lineOfBusiness": null,
+                "platformName": null,
+                "modelInfo": {
+                  "modelType": "VF",
+                  "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+                  "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+                  "modelName": "VF_vMee",
+                  "modelVersion": "2.0",
+                  "modelCustomizationName": "VF_vMee 0"
+                }
+              }
+            },
+            "vnfGroups": {},
+            "networks": {},
+            "instanceParams": [
+              {}
+            ],
+            "validationCounter": 1,
+            "existingNames": {},
+            "existingVnfGroupCounterMap": {},
+            "existingVNFCounterMap": {
+              "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+            },
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "lcpCloudRegionId": "hvf6",
+            "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "aicZoneId": "JAG1",
+            "projectName": "x1",
+            "rollbackOnFailure": "true",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "modelName": "ComplexService",
+              "modelVersion": "1.0",
+              "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+            },
+            "isALaCarte": false,
+            "name": "ComplexService",
+            "version": "1.0",
+            "description": "ComplexService",
+            "category": "Emanuel",
+            "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isMultiStepDesign": false
+          },
+          "6b528779-44a3-4472-bdff-9cd15ec93450": {
+            "networks": {
+              "ExtVL 0": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0",
+                "trackById": "sf3zth68xjf",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [
+                  {}
+                ],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              },
+              "ExtVL 0:0001": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0",
+                "trackById": "2mdxioxca9h",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [
+                  {}
+                ],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              },
+              "ExtVL 0_1": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0_1",
+                "trackById": "z7vd1gmpbs",
+                "instanceName": "ExtVL",
+                "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "zzz1",
+                "instanceParams": [
+                  {
+                    "vnf_config_template_version": "17.2",
+                    "bandwidth_units": "Gbps",
+                    "bandwidth": "10",
+                    "AIC_CLLI": "ATLMY8GA",
+                    "ASN": "AV_vPE",
+                    "vnf_instance_name": "yoav"
+                  }
+                ],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              }
+            },
+            "vnfs": {
+              "2017-488_ADIOD-vPE 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+                      "instanceName": "yoav",
+                      "volumeGroupName": "123",
+                      "modelInfo": {
+                        "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                        "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                        "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                        "modelVersion": "6",
+                        "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                        "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                        "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                      },
+                      "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                      "isMissingData": false,
+                      "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"
+                        }
+                      ]
+                    }
+                  }
+                },
+                "isMissingData": false,
+                "originalName": "2017-488_ADIOD-vPE 0",
+                "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+                "trackById": "o65b26t2thj",
+                "instanceName": "2017488_ADIODvPE",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "platformName": "platform",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [
+                  {}
+                ],
+                "modelInfo": {
+                  "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",
+                  "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+                },
+                "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+              }
+            },
+            "instanceParams": [
+              {
+                "2017488_adiodvpe0_ASN": "AV_vPE"
+              }
+            ],
+            "validationCounter": 0,
+            "existingNames": {
+              "123": "",
+              "instancename": "",
+              "yoav": "",
+              "extvl": ""
+            },
+            "existingVNFCounterMap": {
+              "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1
+            },
+            "existingNetworksCounterMap": {
+              "ddc3f20c-08b5-40fd-af72-c6d14636b986": 3
+            },
+            "instanceName": "InstanceName",
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "aicZoneId": "JAG1",
+            "projectName": null,
+            "rollbackOnFailure": "true",
+            "aicZoneName": "YUDFJULP-JAG1",
+            "owningEntityName": "WayneHolland",
+            "testApi": "GR_API",
+            "tenantName": "USP-SIP-IC-24335-T-01",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+              "modelName": "action-data",
+              "modelVersion": "1.0",
+              "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+            },
+            "isALaCarte": false,
+            "name": "action-data",
+            "version": "1.0",
+            "description": "",
+            "category": "",
+            "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isMultiStepDesign": false
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [
+            {
+              "id": "JANET25",
+              "name": "JANET25",
+              "isPermitted": true
+            },
+            {
+              "id": "hvf6",
+              "name": "hvf6",
+              "isPermitted": true
+            }
+          ],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [
+              {
+                "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                "name": "USP-SIP-IC-24335-T-01",
+                "isPermitted": true
+              }
+            ],
+            "hvf6": [
+              {
+                "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "name": "AIN Web Tool-15-D-testalexandria",
+                "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-hvf6-09",
+                "isPermitted": true
+              },
+              {
+                "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                "name": "DN5242-Nov16-T3",
+                "isPermitted": true
+              }
+            ]
+          }
+        },
+        "productFamilies": [
+          {
+            "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "name": "SCOTTIE",
+            "isPermitted": true
+          },
+          {
+            "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "name": "IGNACIO",
+            "isPermitted": true
+          },
+          {
+            "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "name": "Christie",
+            "isPermitted": true
+          },
+          {
+            "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+            "name": "Enhanced Services",
+            "isPermitted": true
+          },
+          {
+            "id": "vTerrance",
+            "name": "vTerrance",
+            "isPermitted": true
+          },
+          {
+            "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+            "name": "vSCP",
+            "isPermitted": true
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": true
+          },
+          {
+            "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+            "name": "BVOIP",
+            "isPermitted": true
+          },
+          {
+            "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+            "name": "LINDSEY",
+            "isPermitted": true
+          },
+          {
+            "id": "LRSI-OSPF",
+            "name": "LRSI-OSPF",
+            "isPermitted": true
+          },
+          {
+            "id": "vRosemarie",
+            "name": "HNGATEWAY",
+            "isPermitted": true
+          },
+          {
+            "id": "vHNPaas",
+            "name": "WILKINS",
+            "isPermitted": true
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "TYLER SILVIA",
+            "isPermitted": true
+          },
+          {
+            "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+            "name": "VROUTER",
+            "isPermitted": true
+          },
+          {
+            "id": "Cisneros",
+            "name": "vMuriel",
+            "isPermitted": true
+          },
+          {
+            "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+            "name": "CARA Griffin",
+            "isPermitted": true
+          },
+          {
+            "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          },
+          {
+            "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+            "name": "Transport",
+            "isPermitted": true
+          },
+          {
+            "id": "vSalvatore",
+            "name": "vSalvatore",
+            "isPermitted": true
+          },
+          {
+            "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+            "name": "Josefina",
+            "isPermitted": true
+          },
+          {
+            "id": "vHubbard",
+            "name": "vHubbard",
+            "isPermitted": true
+          },
+          {
+            "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          }
+        ],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [
+            {
+              "id": "0",
+              "name": "vRichardson",
+              "isPermitted": false
+            },
+            {
+              "id": "1",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "2",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "3",
+              "name": "vJamie",
+              "isPermitted": false
+            },
+            {
+              "id": "4",
+              "name": "vVoiceMail",
+              "isPermitted": false
+            },
+            {
+              "id": "5",
+              "name": "Kennedy",
+              "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": "LINDSEY",
+              "isPermitted": false
+            },
+            {
+              "id": "17",
+              "name": "JOHANNA_SANTOS",
+              "isPermitted": false
+            },
+            {
+              "id": "18",
+              "name": "vCarroll",
+              "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": "WayneHolland"
+            },
+            {
+              "id": "Melissa",
+              "name": "Melissa"
+            }
+          ],
+          "projectList": [
+            {
+              "id": "WATKINS",
+              "name": "WATKINS"
+            },
+            {
+              "id": "x1",
+              "name": "x1"
+            },
+            {
+              "id": "yyy1",
+              "name": "yyy1"
+            }
+          ],
+          "lineOfBusinessList": [
+            {
+              "id": "ONAP",
+              "name": "ONAP"
+            },
+            {
+              "id": "zzz1",
+              "name": "zzz1"
+            }
+          ],
+          "platformList": [
+            {
+              "id": "platform",
+              "name": "platform"
+            },
+            {
+              "id": "xxx1",
+              "name": "xxx1"
+            }
+          ]
+        },
+        "type": "[LCP_REGIONS_AND_TENANTS] Update",
+        "subscribers": [
+          {
+            "id": "CAR_2020_ER",
+            "name": "CAR_2020_ER",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-2",
+            "name": "DALE BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-1",
+            "name": "LLOYD BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example",
+            "name": "JimmyExampleCust-20161102",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example2",
+            "name": "JimmyExampleCust-20161103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-102",
+            "name": "ERICA5779-TestSub-PWT-102",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-101",
+            "name": "ERICA5779-TestSub-PWT-101",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-4",
+            "name": "ERICA5779-Subscriber-5",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-103",
+            "name": "ERICA5779-TestSub-PWT-103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-2",
+            "name": "ERICA5779-Subscriber-2",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": true
+          },
+          {
+            "id": "ERICA5779-Subscriber-3",
+            "name": "ERICA5779-Subscriber-3",
+            "isPermitted": false
+          },
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          }
+        ]
+      }
+    };
+  }
+}
+
+class MockFeatureFlagsService {}
+
+describe('vnf new popup service', () => {
+  let injector;
+  let service: VnfPopupService;
+  let genericFormService: GenericFormService
+  let defaultDataGeneratorService: DefaultDataGeneratorService;
+  let fb: FormBuilder;
+  let iframeService: IframeService;
+
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      providers : [
+        VnfPopupService,
+        DefaultDataGeneratorService,
+        GenericFormService,
+        FormBuilder,
+        IframeService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        AaiService,
+        LogService,
+        BasicPopupService,
+        VfModulePopuopService,
+        BasicControlGenerator,
+        VnfControlGenerator,
+        {provide: NgRedux, useClass: MockReduxStore},
+        {provide: HttpClient, useClass: MockAppStore},
+      ]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(VnfPopupService);
+    genericFormService = injector.get(GenericFormService);
+    defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+    fb = injector.get(FormBuilder);
+    iframeService = injector.get(IframeService);
+
+  })().then(done).catch(done.fail));
+
+  test('getTitle vnf should return the correct title for edit and create mode', () => {
+    expect(service.getTitle(false)).toBe('Set a new VNF');
+    expect(service.getTitle(true)).toBe('Edit VNF instance');
+  });
+
+  test('getSubRightTitle vnf should return popup type', () => {
+    expect(service.getSubRightTitle()).toBe('VNF Instance Details');
+  });
+
+  test('getModelInformation  vnf should update modelInformations', () => {
+    const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const vnfModelName: string = '2017-388_ADIOD-vPE 1';
+    service.getModelInformation(serviceId, vnfModelName);
+    expect(service.modelInformations.length).toEqual(14);
+    expect(service.modelInformations[0].label).toEqual("Subscriber Name");
+    expect(service.modelInformations[0].values).toEqual(['SILVIA ROBBINS']);
+
+    expect(service.modelInformations[1].label).toEqual("Service Name");
+    expect(service.modelInformations[1].values).toEqual(['action-data']);
+
+    expect(service.modelInformations[2].label).toEqual("Service Instance Name");
+    expect(service.modelInformations[2].values).toEqual(['InstanceName']);
+
+    expect(service.modelInformations[3].label).toEqual("Model Name");
+    expect(service.modelInformations[3].values).toEqual(['2017-388_ADIOD-vPE']);
+
+    expect(service.modelInformations[4].label).toEqual("Model version");
+    expect(service.modelInformations[4].values).toEqual(['1.0']);
+
+    expect(service.modelInformations[5].label).toEqual("Description");
+    expect(service.modelInformations[5].values).toEqual(['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']);
+
+    expect(service.modelInformations[6].label).toEqual("Category");
+    expect(service.modelInformations[6].values).toEqual([undefined]);
+
+    expect(service.modelInformations[7].label).toEqual("Sub Category");
+    expect(service.modelInformations[7].values).toEqual([undefined]);
+
+    expect(service.modelInformations[8].label).toEqual("UUID");
+    expect(service.modelInformations[8].values).toEqual(['0903e1c0-8e03-4936-b5c2-260653b96413']);
+
+    expect(service.modelInformations[9].label).toEqual("Invariant UUID");
+    expect(service.modelInformations[9].values).toEqual(['00beb8f9-6d39-452f-816d-c709b9cbb87d']);
+
+    expect(service.modelInformations[10].label).toEqual("Service type");
+    expect(service.modelInformations[10].values).toEqual(['']);
+
+    expect(service.modelInformations[11].label).toEqual("Service role");
+    expect(service.modelInformations[11].values).toEqual(['']);
+
+    expect(service.modelInformations[12].label).toEqual("Minimum to instantiate");
+    expect(service.modelInformations[12].values).toEqual(['0']);
+
+    expect(service.modelInformations[13].label).toEqual("Maximum to instantiate");
+    expect(service.modelInformations[13].values).toEqual(['5']);
+  });
+
+  test('getSubLeftTitle new vnf popup should return service model name', () => {
+    service.uuidData = {
+      serviceId: '6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+      modelName: 'VF_vMee 0'
+    };
+    expect(service.getSubLeftTitle()).toBe('VNF MODEL: VF_vMee');
+  });
+
+  test('getInstance with empty storekey should be created', () => {
+    const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44';
+    const vnfModelName: string = '2017-388_ADIOD-vPE 1';
+    const newInstance = service.getInstance(serviceId, vnfModelName, null);
+    expect(newInstance).toBeDefined();
+  });
+
+  test('getInstance with not empty storekey should return vnfStoreKey', () => {
+    const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const vnfModelName: string = '2017-388_ADIOD-vPE 1';
+    const vnfStoreKey: string = '2017-488_ADIOD-vPE 0';
+    const newInstance = service.getInstance(serviceId, vnfModelName, vnfStoreKey);
+    expect(newInstance.vnfStoreKey).toEqual('2017-488_ADIOD-vPE 0');
+  });
+
+  test('getGenericFormPopupDetails returns the FormPopupDetails object', () => {
+      const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44';
+      const vnfModelName: string = 'VF_vMee 0';
+      const vnfStoreKey: string = 'VF_vMee 0';
+      let uuidData: UUIDData = <any>{
+        serviceId: "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+        modelName: "VF_vMee 0",
+        vnfStoreKey: "VF_vMee 0"
+      };
+      const formPopupDetailsObject = service.getGenericFormPopupDetails(serviceId, vnfModelName, vnfStoreKey, null, uuidData, true);
+      expect(formPopupDetailsObject).toBeDefined();
+    }
+  );
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.ts
new file mode 100644 (file)
index 0000000..8969e3c
--- /dev/null
@@ -0,0 +1,158 @@
+import {Injectable} from '@angular/core';
+import {GenericPopupInterface} from "../generic-popup.interface";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
+import {FormGroup} from "@angular/forms";
+import {ModelInformationItem} from "../../../model-information/model-information.component";
+import {ServiceModel} from "../../../../models/serviceModel";
+import {Subject} from "rxjs/Subject";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {VnfControlGenerator} from "../../../genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../store/reducers";
+import {Subscriber} from "../../../../models/subscriber";
+import {Constants} from "../../../../utils/constants";
+import {VnfInstance} from "../../../../models/vnfInstance";
+import {ModelInfo} from "../../../../models/modelInfo";
+import {changeInstanceCounter} from "../../../../storeUtil/utils/general/general.actions";
+import {createVNFInstance, updateVNFInstance} from "../../../../storeUtil/utils/vnf/vnf.actions";
+import * as _ from 'lodash';
+
+@Injectable()
+export class VnfPopupService implements GenericPopupInterface{
+  dynamicInputs: any;
+  instance: any;
+  model:any;
+  serviceModel:ServiceModel;
+  modelInformations: ModelInformationItem[] = [];
+  uuidData: Object;
+  closeDialogEvent: Subject<any> = new Subject<any>();
+  isUpdateMode: boolean;
+
+  constructor(
+    private _basicControlGenerator: BasicControlGenerator,
+    private _vnfControlGenerator: VnfControlGenerator,
+    private _iframeService: IframeService,
+    private _defaultDataGeneratorService: DefaultDataGeneratorService,
+    private _aaiService: AaiService,
+    private _basicPopupService: BasicPopupService,
+    private _store: NgRedux<AppState>) {
+  }
+
+  getGenericFormPopupDetails(serviceId: string, modelName: string, vnfStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
+    this.uuidData = uuidData;
+    this.isUpdateMode = isUpdateMode;
+    this.instance = this.getInstance(serviceId, modelName, vnfStoreKey);
+    this.getModelInformation(serviceId, modelName);
+
+    return new FormPopupDetails(this,
+      PopupType.VNF_MACRO,
+      uuidData,
+      this.getTitle(isUpdateMode),
+      this.getSubLeftTitle(),
+      this.getSubRightTitle(),
+      this.getControls(serviceId, modelName, vnfStoreKey),
+      this._basicPopupService.getDynamicInputs(serviceId, modelName, vnfStoreKey, 'vnfs'),
+      this.modelInformations,
+      (that, form: FormGroup) => {that.onSubmit(that, form);},
+      (that: any, form: FormGroup) => {that.onCancel(that, form); }
+      )
+  }
+
+  getControls(serviceId: string, modelName: string, vnfStoreKey: string){
+    if(this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') {
+      return this._vnfControlGenerator.getMacroFormControls(serviceId, vnfStoreKey, modelName);
+    } else {
+      return this._vnfControlGenerator.getAlaCarteFormControls(serviceId, vnfStoreKey, modelName);
+    }
+  }
+
+  getInstance(serviceId: string, modelName: string, vnfStoreKey: string): any {
+    if(_.isNil(vnfStoreKey)){
+      return new VnfInstance();
+    }
+    return this._store.getState().service.serviceInstance[serviceId].vnfs[vnfStoreKey];
+  }
+
+  getModelInformation(serviceId: string, modelName: string): void {
+    this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
+      this.serviceModel = new ServiceModel(result);
+      this.model = this._basicPopupService.getModelFromResponse(result, 'vnfs', modelName);
+      const serviceInstance = this._store.getState().service.serviceInstance[serviceId];
+      this.modelInformations = [
+        new ModelInformationItem("Subscriber Name", "subscriberName", [this.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId, this._store)], "", 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]),
+        new ModelInformationItem("Minimum to instantiate", "vnf-min", [!_.isNil(this.model.min) ? this.model.min.toString() : '0'], "", false),
+        new ModelInformationItem("Maximum to instantiate", "vnf-max", [!_.isNil(this.model.max) ? this.model.max.toString() : '1'], "", false)
+        ];
+    })
+  }
+
+  getSubLeftTitle(): string {
+    return "VNF MODEL: " + this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].vnfs[this.uuidData['modelName']].name;
+  }
+
+  getSubRightTitle(): string {
+    return "VNF Instance Details";
+  }
+
+  storeVNF = (that, formValues: any): void => {
+    formValues.modelInfo = new ModelInfo(that.model);
+    formValues.uuid = formValues.modelInfo.uuid;
+    formValues.isMissingData = false;
+    if(!that.isUpdateMode){
+      that._store.dispatch(changeInstanceCounter(formValues.modelInfo.modelUniqueId, that.uuidData.serviceId, 1 , <any> {data: {type: 'VF'}}));
+      this._store.dispatch(createVNFInstance(formValues, that.uuidData['modelName'], that.uuidData['serviceId'], that.uuidData['modelName']));
+    }else {
+      that._store.dispatch(updateVNFInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, that.uuidData.vnfStoreKey))
+    }
+  };
+
+  getTitle(isUpdateMode: boolean): string {
+    return isUpdateMode  ? "Edit VNF instance": "Set a new VNF" ;
+  }
+
+  onCancel(that, form): void {
+    form.reset();
+    that._iframeService.removeClassCloseModal('content');
+    this.closeDialogEvent.next(that);
+  }
+
+  onSubmit(that, form: FormGroup, ...args): void {
+    form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']];
+    that.storeVNF(that, form.value);
+    window.parent.postMessage( {
+      eventId: 'submitIframe',
+      data: {
+        serviceModelId: that.uuidData.serviceId
+      }
+    }, "*");
+    that.onCancel(that, form);
+  }
+
+  extractSubscriberNameBySubscriberId(subscriberId: string, store: NgRedux<AppState>) {
+    let result: string = null;
+    let filteredArray: any = _.filter(store.getState().service.subscribers, function (o: Subscriber) {
+      return o.id === subscriberId
+    });
+    if (filteredArray.length > 0) {
+      result = filteredArray[0].name;
+    }
+    return result;
+  }
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.spec.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.spec.ts
new file mode 100644 (file)
index 0000000..6027f43
--- /dev/null
@@ -0,0 +1,3239 @@
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {NgRedux} from "@angular-redux/store";
+import {ReflectiveInjector} from "@angular/core";
+import {IframeService} from "../../../../utils/iframe.service";
+import {VfModulePopuopService} from "../vfModule/vfModule.popuop.service";
+import {FormBuilder} from "@angular/forms";
+import {GenericFormService} from "../../../genericForm/generic-form.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {LogService} from "../../../../utils/log/log.service";
+import {HttpClient} from "@angular/common/http";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {UUIDData} from "../../generic-form-popup.component";
+import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
+import {VnfGroupPopupService} from "./vnfGroup.popup.service";
+import {VnfGroupControlGenerator} from "../../../genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+class MockAppStore<T> {}
+
+class MockReduxStore<T> {
+  getState() {
+    return {
+      "global": {
+        "name": null,
+        "flags": {
+          "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
+          "FLAG_SHOW_ASSIGNMENTS": true,
+          "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
+          "FLAG_UNASSIGN_SERVICE": true,
+          "FLAG_SHOW_VERIFY_SERVICE": false,
+          "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+          "FLAG_DUPLICATE_VNF": true,
+          "FLAG_SERVICE_MODEL_CACHE": true,
+          "FLAG_ADVANCED_PORTS_FILTER": true,
+          "CREATE_INSTANCE_TEST": false,
+          "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
+          "FLAG_REGION_ID_FROM_REMOTE": true,
+          "FLAG_ASYNC_INSTANTIATION": true,
+          "FLAG_ASYNC_JOBS": true,
+          "EMPTY_DRAWING_BOARD_TEST": false,
+          "FLAG_ADD_MSO_TESTAPI_FIELD": true
+        },
+        "type": "[FLAGS] Update"
+      },
+      "service": {
+        "serviceHierarchy": {
+          "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": "Emanuel",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "ComplexService",
+              "serviceEcompNaming": "false",
+              "instantiationType": "Macro",
+              "inputs": {}
+            },
+            "vnfGroups": {
+              "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": {
+                  "max_instances": 10,
+                  "min_instances": 1,
+                  "gpb2_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-ipv6-ingress-src_start_port": "0.0",
+                  "ncb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+                  "Internal2_net_cidr": "10.0.0.10",
+                  "sctp-a-ingress-dst_start_port": "0.0",
+                  "sctp-a-egress-dst_start_port": "0.0",
+                  "fsb1_Internal2_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-a-ipv6-ingress-src_start_port": "0.0",
+                  "sctp-b-ipv6-egress_ethertype": "IPv4",
+                  "Internal1_net_cidr": "10.0.0.10",
+                  "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": "false",
+                  "sctp-a-IPv6_ethertype": "IPv6",
+                  "vlc2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+                  "Internal1_net_cidr_len": "17",
+                  "gpb2_Internal1_mac": "00:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "vlc_st_interface_type_oam": "management",
+                  "multi_stage_design": "true",
+                  "oam_sec_group_name": "oam-sec-group",
+                  "Internal2_net_gateway": "10.0.0.10",
+                  "sctp-a-ipv6-ingress-dst_end_port": "65535",
+                  "sctp-b-ipv6-egress-dst_start_port": "0",
+                  "Internal1_net_gateway": "10.0.0.10",
+                  "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:11:22:EF:AC:DF",
+                  "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:11:22:EF:AC:DF",
+                  "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": "VnfGroup",
+                "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": true
+                  },
+                  "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": {
+                  "netowrk_role": "role 1, role 2, role 3",
+                  "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": true
+              },
+              "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": {}
+          },
+          "6b528779-44a3-4472-bdff-9cd15ec93450": {
+            "service": {
+              "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+              "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "name": "action-data",
+              "version": "1.0",
+              "toscaModelURL": null,
+              "category": "",
+              "serviceType": "",
+              "serviceRole": "",
+              "description": "",
+              "serviceEcompNaming": "false",
+              "instantiationType": "A-La-Carte",
+              "inputs": {
+                "2017488_adiodvpe0_ASN": {
+                  "type": "string",
+                  "description": "AV/PE",
+                  "entry_schema": null,
+                  "inputProperties": null,
+                  "constraints": [],
+                  "required": true,
+                  "default": "AV_vPE"
+                }
+              }
+            },
+            "vnfGroups": {
+              "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,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": {
+                  "max_instances": 5,
+                  "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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": "VnfGroup",
+                "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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",
+                  "min_instances": "1",
+                  "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                  "vf_module_id": "123",
+                  "nf_function": "JAI",
+                  "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                  "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": "VnfGroup",
+                "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": 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": "10.0.0.10",
+                  "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": "10.0.0.10",
+                  "is_AVPN_service": "false",
+                  "vmx_RSG_name": "vREXI-affinity",
+                  "vmx_int_ctl_forwarding": "l2",
+                  "vmxvre_oam_ip_0": "10.0.0.10",
+                  "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",
+                  "max_instances": "3",
+                  "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",
+                  "min_instances": "1",
+                  "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+                  "vf_module_id": "123",
+                  "nf_function": "JAI",
+                  "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+                  "vmxvre_int_ctl_ip_0": "10.0.0.10",
+                  "ecomp_generated_naming": "false",
+                  "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.0.0.10",
+                  "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": "VnfGroup",
+                "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": {
+              "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": {
+                  "vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "10"
+                  },
+                  "AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "ASN": {
+                    "type": "string",
+                    "description": "AV/PE",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "AV_vPE"
+                  },
+                  "vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": null,
+                    "constraints": [],
+                    "required": true,
+                    "default": "mtnj309me6"
+                  }
+                },
+                "commands": {},
+                "properties": {
+                  "network_role": "network role 1, network role 2",
+                  "min_instances": 1,
+                  "max_instances": 10,
+                  "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": {},
+            "fabricConfigurations": {},
+            "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": {
+          "6e59c5de-f052-46fa-aa7e-2fca9d674c44": {
+            "vnfGroups": {
+              "VF_vMee 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "vf_vmee0..VfVmee..base_vmme..module-0": {
+                    "vf_vmee0..VfVmee..base_vmme..module-0vmvzo": {
+                      "isMissingData": false,
+                      "sdncPreReload": null,
+                      "modelInfo": {
+                        "modelType": "VFmodule",
+                        "modelInvariantId": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+                        "modelVersionId": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+                        "modelName": "VfVmee..base_vmme..module-0",
+                        "modelVersion": "2",
+                        "modelCustomizationId": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                        "modelCustomizationName": "VfVmee..base_vmme..module-0"
+                      },
+                      "instanceParams": [
+                        {}
+                      ],
+                      "trackById": "wmtm6sy2uj"
+                    }
+                  }
+                },
+                "isMissingData": true,
+                "originalName": "VF_vMee 0",
+                "vnfGroupStoreKey": "VF_vMee 0",
+                "trackById": "p3wk448m5do",
+                "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+                "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+                "lcpCloudRegionId": null,
+                "tenantId": null,
+                "lineOfBusiness": null,
+                "platformName": null,
+                "modelInfo": {
+                  "modelType": "VnfGroup",
+                  "modelInvariantId": "4160458e-f648-4b30-a176-43881ffffe9e",
+                  "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+                  "modelName": "VF_vMee",
+                  "modelVersion": "2.0",
+                  "modelCustomizationName": "VF_vMee 0"
+                }
+              }
+            },
+            "networks": {},
+            "instanceParams": [
+              {}
+            ],
+            "validationCounter": 1,
+            "existingNames": {},
+            "existingVNFCounterMap": {
+              "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+            },
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "lcpCloudRegionId": "hvf6",
+            "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "aicZoneId": "JAG1",
+            "projectName": "x1",
+            "rollbackOnFailure": "true",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+              "modelName": "ComplexService",
+              "modelVersion": "1.0",
+              "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44"
+            },
+            "isALaCarte": false,
+            "name": "ComplexService",
+            "version": "1.0",
+            "description": "ComplexService",
+            "category": "Emanuel",
+            "uuid": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isEcompGeneratedNaming": false,
+            "isMultiStepDesign": false
+          },
+          "6b528779-44a3-4472-bdff-9cd15ec93450": {
+            "networks": {
+              "ExtVL 0": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0",
+                "trackById": "sf3zth68xjf",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [
+                  {}
+                ],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              },
+              "ExtVL 0:0001": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0",
+                "trackById": "2mdxioxca9h",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [
+                  {}
+                ],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              },
+              "ExtVL 0_1": {
+                "rollbackOnFailure": "true",
+                "isMissingData": false,
+                "originalName": "ExtVL 0",
+                "networkStoreKey": "ExtVL 0_1",
+                "trackById": "z7vd1gmpbs",
+                "instanceName": "ExtVL",
+                "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+                "platformName": "xxx1",
+                "lineOfBusiness": "zzz1",
+                "instanceParams": [
+                  {
+                    "vnf_config_template_version": "17.2",
+                    "bandwidth_units": "Gbps",
+                    "bandwidth": "10",
+                    "AIC_CLLI": "ATLMY8GA",
+                    "ASN": "AV_vPE",
+                    "vnf_instance_name": "yoav"
+                  }
+                ],
+                "modelInfo": {
+                  "modelInvariantId": "379f816b-a7aa-422f-be30-17114ff50b7c",
+                  "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+                  "modelName": "ExtVL",
+                  "modelVersion": "37.0",
+                  "modelCustomizationId": "94fdd893-4a36-4d70-b16a-ec29c54c184f",
+                  "modelCustomizationName": "ExtVL 0",
+                  "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+                },
+                "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986"
+              }
+            },
+            "vnfGroups": {
+              "2017-488_ADIOD-vPE 0": {
+                "rollbackOnFailure": "true",
+                "vfModules": {
+                  "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1sgoqi": {
+                      "instanceName": "yoav",
+                      "volumeGroupName": "123",
+                      "modelInfo": {
+                        "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                        "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                        "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                        "modelVersion": "6",
+                        "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                        "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                        "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                      },
+                      "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                      "isMissingData": false,
+                      "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"
+                        }
+                      ]
+                    }
+                  }
+                },
+                "isMissingData": false,
+                "originalName": "2017-488_ADIOD-vPE 0",
+                "vnfGroupStoreKey": "2017-488_ADIOD-vPE 0",
+                "trackById": "o65b26t2thj",
+                "instanceName": "2017488_ADIODvPE",
+                "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+                "lcpCloudRegionId": "hvf6",
+                "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "platformName": "platform",
+                "lineOfBusiness": "ONAP",
+                "instanceParams": [
+                  {}
+                ],
+                "modelInfo": {
+                  "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",
+                  "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+                },
+                "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+              }
+            },
+            "instanceParams": [
+              {
+                "2017488_adiodvpe0_ASN": "AV_vPE"
+              }
+            ],
+            "validationCounter": 0,
+            "existingNames": {
+              "123": "",
+              "instancename": "",
+              "yoav": "",
+              "extvl": ""
+            },
+            "existingVnfGroupCounterMap": {
+              "69e09f68-8b63-4cc9-b9ff-860960b5db09": 1
+            },
+            "existingNetworksCounterMap": {
+              "ddc3f20c-08b5-40fd-af72-c6d14636b986": 3
+            },
+            "instanceName": "InstanceName",
+            "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "subscriptionServiceType": "TYLER SILVIA",
+            "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+            "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "aicZoneId": "JAG1",
+            "projectName": null,
+            "rollbackOnFailure": "true",
+            "aicZoneName": "YUDFJULP-JAG1",
+            "owningEntityName": "WayneHolland",
+            "testApi": "GR_API",
+            "isEcompGeneratedNaming": true,
+            "tenantName": "USP-SIP-IC-24335-T-01",
+            "bulkSize": 1,
+            "modelInfo": {
+              "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+              "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+              "modelName": "action-data",
+              "modelVersion": "1.0",
+              "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+            },
+            "isALaCarte": false,
+            "name": "action-data",
+            "version": "1.0",
+            "description": "",
+            "category": "",
+            "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+            "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "serviceType": "",
+            "serviceRole": "",
+            "isMultiStepDesign": false
+          }
+        },
+        "lcpRegionsAndTenants": {
+          "lcpRegionList": [
+            {
+              "id": "JANET25",
+              "name": "JANET25",
+              "isPermitted": true
+            },
+            {
+              "id": "hvf6",
+              "name": "hvf6",
+              "isPermitted": true
+            }
+          ],
+          "lcpRegionsTenantsMap": {
+            "JANET25": [
+              {
+                "id": "092eb9e8e4b7412e8787dd091bc58e86",
+                "name": "USP-SIP-IC-24335-T-01",
+                "isPermitted": true
+              }
+            ],
+            "hvf6": [
+              {
+                "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+                "name": "AIN Web Tool-15-D-testalexandria",
+                "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-hvf6-09",
+                "isPermitted": true
+              },
+              {
+                "id": "cbb99fe4ada84631b7baf046b6fd2044",
+                "name": "DN5242-Nov16-T3",
+                "isPermitted": true
+              }
+            ]
+          }
+        },
+        "productFamilies": [
+          {
+            "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "name": "SCOTTIE",
+            "isPermitted": true
+          },
+          {
+            "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+            "name": "IGNACIO",
+            "isPermitted": true
+          },
+          {
+            "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "name": "Christie",
+            "isPermitted": true
+          },
+          {
+            "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+            "name": "Enhanced Services",
+            "isPermitted": true
+          },
+          {
+            "id": "vTerrance",
+            "name": "vTerrance",
+            "isPermitted": true
+          },
+          {
+            "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+            "name": "vSCP",
+            "isPermitted": true
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": true
+          },
+          {
+            "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+            "name": "BVOIP",
+            "isPermitted": true
+          },
+          {
+            "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+            "name": "LINDSEY",
+            "isPermitted": true
+          },
+          {
+            "id": "LRSI-OSPF",
+            "name": "LRSI-OSPF",
+            "isPermitted": true
+          },
+          {
+            "id": "vRosemarie",
+            "name": "HNGATEWAY",
+            "isPermitted": true
+          },
+          {
+            "id": "vHNPaas",
+            "name": "WILKINS",
+            "isPermitted": true
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "TYLER SILVIA",
+            "isPermitted": true
+          },
+          {
+            "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+            "name": "VROUTER",
+            "isPermitted": true
+          },
+          {
+            "id": "Cisneros",
+            "name": "vMuriel",
+            "isPermitted": true
+          },
+          {
+            "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+            "name": "CARA Griffin",
+            "isPermitted": true
+          },
+          {
+            "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          },
+          {
+            "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+            "name": "Transport",
+            "isPermitted": true
+          },
+          {
+            "id": "vSalvatore",
+            "name": "vSalvatore",
+            "isPermitted": true
+          },
+          {
+            "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+            "name": "Josefina",
+            "isPermitted": true
+          },
+          {
+            "id": "vHubbard",
+            "name": "vHubbard",
+            "isPermitted": true
+          },
+          {
+            "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+            "name": "DARREN MCGEE",
+            "isPermitted": true
+          }
+        ],
+        "serviceTypes": {
+          "e433710f-9217-458d-a79d-1c7aff376d89": [
+            {
+              "id": "0",
+              "name": "vRichardson",
+              "isPermitted": false
+            },
+            {
+              "id": "1",
+              "name": "TYLER SILVIA",
+              "isPermitted": true
+            },
+            {
+              "id": "2",
+              "name": "Emanuel",
+              "isPermitted": false
+            },
+            {
+              "id": "3",
+              "name": "vJamie",
+              "isPermitted": false
+            },
+            {
+              "id": "4",
+              "name": "vVoiceMail",
+              "isPermitted": false
+            },
+            {
+              "id": "5",
+              "name": "Kennedy",
+              "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": "LINDSEY",
+              "isPermitted": false
+            },
+            {
+              "id": "17",
+              "name": "JOHANNA_SANTOS",
+              "isPermitted": false
+            },
+            {
+              "id": "18",
+              "name": "vCarroll",
+              "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": "WayneHolland"
+            },
+            {
+              "id": "Melissa",
+              "name": "Melissa"
+            }
+          ],
+          "projectList": [
+            {
+              "id": "WATKINS",
+              "name": "WATKINS"
+            },
+            {
+              "id": "x1",
+              "name": "x1"
+            },
+            {
+              "id": "yyy1",
+              "name": "yyy1"
+            }
+          ],
+          "lineOfBusinessList": [
+            {
+              "id": "ONAP",
+              "name": "ONAP"
+            },
+            {
+              "id": "zzz1",
+              "name": "zzz1"
+            }
+          ],
+          "platformList": [
+            {
+              "id": "platform",
+              "name": "platform"
+            },
+            {
+              "id": "xxx1",
+              "name": "xxx1"
+            }
+          ]
+        },
+        "type": "[LCP_REGIONS_AND_TENANTS] Update",
+        "subscribers": [
+          {
+            "id": "CAR_2020_ER",
+            "name": "CAR_2020_ER",
+            "isPermitted": true
+          },
+          {
+            "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+            "name": "JULIO ERICKSON",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-2",
+            "name": "DALE BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "DHV1707-TestSubscriber-1",
+            "name": "LLOYD BRIDGES",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example",
+            "name": "JimmyExampleCust-20161102",
+            "isPermitted": false
+          },
+          {
+            "id": "jimmy-example2",
+            "name": "JimmyExampleCust-20161103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-102",
+            "name": "ERICA5779-TestSub-PWT-102",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-101",
+            "name": "ERICA5779-TestSub-PWT-101",
+            "isPermitted": false
+          },
+          {
+            "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+            "name": "Emanuel",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-4",
+            "name": "ERICA5779-Subscriber-5",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-TestSub-PWT-103",
+            "name": "ERICA5779-TestSub-PWT-103",
+            "isPermitted": false
+          },
+          {
+            "id": "ERICA5779-Subscriber-2",
+            "name": "ERICA5779-Subscriber-2",
+            "isPermitted": false
+          },
+          {
+            "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "name": "SILVIA ROBBINS",
+            "isPermitted": true
+          },
+          {
+            "id": "ERICA5779-Subscriber-3",
+            "name": "ERICA5779-Subscriber-3",
+            "isPermitted": false
+          },
+          {
+            "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+            "name": "CRAIG/ROBERTS",
+            "isPermitted": false
+          }
+        ]
+      }
+    };
+  }
+}
+
+class MockFeatureFlagsService {}
+
+describe('vnf group new popup service', () => {
+  let injector;
+  let service: VnfGroupPopupService;
+  let genericFormService: GenericFormService
+  let defaultDataGeneratorService: DefaultDataGeneratorService;
+  let fb: FormBuilder;
+  let iframeService: IframeService;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      providers : [
+        VnfGroupPopupService,
+        DefaultDataGeneratorService,
+        GenericFormService,
+        FormBuilder,
+        IframeService,
+        {provide:FeatureFlagsService, useClass: MockFeatureFlagsService},
+        AaiService,
+        LogService,
+        BasicPopupService,
+        VfModulePopuopService,
+        BasicControlGenerator,
+        VnfGroupControlGenerator,
+        {provide: NgRedux, useClass: MockReduxStore},
+        {provide: HttpClient, useClass: MockAppStore}]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(VnfGroupPopupService);
+    genericFormService = injector.get(GenericFormService);
+    defaultDataGeneratorService = injector.get(DefaultDataGeneratorService);
+    fb = injector.get(FormBuilder);
+    iframeService = injector.get(IframeService);
+
+  })().then(done).catch(done.fail));
+
+  test('getTitle vnf group should return the correct title for edit and create mode', () => {
+    expect(service.getTitle(false)).toBe('Set a new VNF Group');
+    expect(service.getTitle(true)).toBe('Edit VNF Group instance');
+  });
+
+  test('getSubRightTitle vnf should return popup type', () => {
+    expect(service.getSubRightTitle()).toBe('VNF Group Instance Details');
+  });
+
+  test('getModelInformation vnfGroup should update modelInformations', () => {
+    const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const vnfGroupModelName: string = '2017-388_ADIOD-vPE 1';
+    service.getModelInformation(serviceId, vnfGroupModelName);
+    expect(service.modelInformations.length).toEqual(14);
+
+    expect(service.modelInformations[0].label).toEqual("Model version");
+    expect(service.modelInformations[0].values).toEqual(['1.0']);
+
+    expect(service.modelInformations[1].label).toEqual("Description");
+    expect(service.modelInformations[1].values).toEqual(['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']);
+
+    expect(service.modelInformations[2].label).toEqual("Category");
+    expect(service.modelInformations[2].values).toEqual([undefined]);
+
+    expect(service.modelInformations[3].label).toEqual("Sub Category");
+    expect(service.modelInformations[3].values).toEqual([undefined]);
+
+    expect(service.modelInformations[4].label).toEqual("UUID");
+    expect(service.modelInformations[4].values).toEqual(['0903e1c0-8e03-4936-b5c2-260653b96413']);
+
+    expect(service.modelInformations[5].label).toEqual("Invariant UUID");
+    expect(service.modelInformations[5].values).toEqual(['00beb8f9-6d39-452f-816d-c709b9cbb87d']);
+
+    expect(service.modelInformations[6].label).toEqual("Type");
+    expect(service.modelInformations[6].values).toEqual([undefined]);
+
+    expect(service.modelInformations[7].label).toEqual("Role");
+    expect(service.modelInformations[7].values).toEqual([undefined]);
+
+    expect(service.modelInformations[8].label).toEqual("Function");
+    expect(service.modelInformations[8].values).toEqual([undefined]);
+
+    expect(service.modelInformations[9].label).toEqual("Member resource type");
+    expect(service.modelInformations[9].values).toEqual(['VNF']);
+
+    expect(service.modelInformations[10].label).toEqual("Members service Invariant UUID");
+    expect(service.modelInformations[10].values).toEqual([]);
+
+    expect(service.modelInformations[11].label).toEqual("Members service model name");
+    expect(service.modelInformations[11].values).toEqual([]);
+
+    expect(service.modelInformations[12].label).toEqual("Minimum to instantiate");
+    expect(service.modelInformations[12].values).toEqual(['0']);
+
+    expect(service.modelInformations[13].label).toEqual("Maximum to instantiate");
+    expect(service.modelInformations[13].values).toEqual(['Unlimited']);
+  });
+
+  test('getSubLeftTitle new vnf group popup should return service model name', () => {
+    service.uuidData = {
+      serviceId: '6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+      modelName: 'VF_vMee 0'
+    };
+    expect(service.getSubLeftTitle()).toBe('VNF Group : VF_vMee');
+  });
+
+  test('getInstance with empty storekey should be created', () => {
+    const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44';
+    const vnfGroupModelName: string = '2017-388_ADIOD-vPE 1';
+    const newInstance = service.getInstance(serviceId, vnfGroupModelName, null);
+    expect(newInstance).toBeDefined();
+  });
+
+  test('getInstance with not empty storekey should return vnfGroupStoreKey', () => {
+    const serviceId: string = '6b528779-44a3-4472-bdff-9cd15ec93450';
+    const vnfGroupModelName: string = '2017-388_ADIOD-vPE 1';
+    const vnfGroupStoreKey: string = '2017-488_ADIOD-vPE 0';
+    const newInstance = service.getInstance(serviceId, vnfGroupModelName, vnfGroupStoreKey);
+    expect(newInstance.vnfGroupStoreKey).toEqual('2017-488_ADIOD-vPE 0');
+  });
+
+  test('getGenericFormPopupDetails returns the FormPopupDetails object', () => {
+      const serviceId: string = '6e59c5de-f052-46fa-aa7e-2fca9d674c44';
+      const vnfGroupModelName: string = 'VF_vMee 0';
+      const vnfGroupStoreKey: string = 'VF_vMee 0';
+      let uuidData: UUIDData = <any>{
+        serviceId: "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+        modelName: "VF_vMee 0",
+        vnfGroupStoreKey: "VF_vMee 0"
+      };
+      const formPopupDetailsObject = service.getGenericFormPopupDetails(serviceId, vnfGroupModelName, vnfGroupStoreKey, null, uuidData, true);
+      expect(formPopupDetailsObject).toBeDefined();
+    }
+  );
+});
diff --git a/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.ts b/vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.ts
new file mode 100644 (file)
index 0000000..748edd2
--- /dev/null
@@ -0,0 +1,158 @@
+import {Injectable} from '@angular/core';
+import {GenericPopupInterface} from "../generic-popup.interface";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
+import {FormGroup} from "@angular/forms";
+import {ModelInformationItem} from "../../../model-information/model-information.component";
+import {ServiceModel} from "../../../../models/serviceModel";
+import {Subject} from "rxjs/Subject";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../store/reducers";
+import {Subscriber} from "../../../../models/subscriber";
+import {Constants} from "../../../../utils/constants";
+import {ModelInfo} from "../../../../models/modelInfo";
+import {changeInstanceCounter} from "../../../../storeUtil/utils/general/general.actions";
+import * as _ from 'lodash';
+import {VnfGroupControlGenerator} from "../../../genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {VnfGroupInstance} from "../../../../models/vnfGroupInstance";
+import {createVnfGroupInstance, updateVnfGroupInstance} from "../../../../storeUtil/utils/vnfGroup/vnfGroup.actions";
+
+@Injectable()
+export class VnfGroupPopupService implements GenericPopupInterface{
+  dynamicInputs: any;
+  instance: any;
+  model:any;
+  serviceModel:ServiceModel;
+  modelInformations: ModelInformationItem[] = [];
+  uuidData: Object;
+  closeDialogEvent: Subject<any> = new Subject<any>();
+  isUpdateMode: boolean;
+
+  constructor(
+    private _basicControlGenerator: BasicControlGenerator,
+    private _vnfGroupControlGenerator: VnfGroupControlGenerator,
+    private _iframeService: IframeService,
+    private _defaultDataGeneratorService: DefaultDataGeneratorService,
+    private _aaiService: AaiService,
+    private _basicPopupService: BasicPopupService,
+    private _store: NgRedux<AppState>) {
+  }
+
+  getGenericFormPopupDetails(serviceId: string, modelName: string, vnfGroupStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
+    this.uuidData = uuidData;
+    this.isUpdateMode = isUpdateMode;
+    this.instance = this.getInstance(serviceId, modelName, vnfGroupStoreKey);
+    this.getModelInformation(serviceId, modelName);
+
+    return new FormPopupDetails(this,
+      PopupType.VNF_GROUP,
+      uuidData,
+      this.getTitle(isUpdateMode),
+      this.getSubLeftTitle(),
+      this.getSubRightTitle(),
+      this.getControls(serviceId, modelName, vnfGroupStoreKey),
+      this._basicPopupService.getDynamicInputs(serviceId, modelName, vnfGroupStoreKey, 'vnfGroups'),
+      this.modelInformations,
+      (that, form: FormGroup) => {that.onSubmit(that, form);},
+      (that: any, form: FormGroup) => {that.onCancel(that, form); }
+      )
+  }
+
+  getControls(serviceId: string, modelName: string, vnfGroupStoreKey: string){
+    if(this._store.getState().service.serviceHierarchy[serviceId].service.instantiationType === 'Macro') {
+      return this._vnfGroupControlGenerator.getMacroFormControls(serviceId, vnfGroupStoreKey, modelName);
+    } else {
+      return this._vnfGroupControlGenerator.getAlaCarteFormControls(serviceId, vnfGroupStoreKey, modelName);
+    }
+  }
+
+  getInstance(serviceId: string, modelName: string, vnfGroupStoreKey: string): any {
+    if(_.isNil(vnfGroupStoreKey)){
+      return new VnfGroupInstance();
+    }
+    return this._store.getState().service.serviceInstance[serviceId].vnfGroups[vnfGroupStoreKey];
+  }
+
+  getModelInformation(serviceId: string, modelName: string): void {
+    this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
+      this.serviceModel = new ServiceModel(result);
+      this.model = this._basicPopupService.getModelFromResponse(result, 'vnfGroups', modelName);
+      const serviceInstance = this._store.getState().service.serviceInstance[serviceId];
+      this.modelInformations = [
+        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("Type", "type", [this.model.properties.type], "", true),
+        new ModelInformationItem("Role", "role", [this.model.properties.role]),
+        new ModelInformationItem("Function", "function", [this.model.properties.function]),
+        new ModelInformationItem("Member resource type", "contained_resource_type", ["VNF"], "", true),
+        new ModelInformationItem("Members service Invariant UUID", "Members service Invariant UUID", _.toArray(_.mapValues(this.model.members, 'sourceModelInvariant'))),
+        new ModelInformationItem("Members service model name", "sourceModelName", _.toArray(_.mapValues(this.model.members, 'sourceModelName'))),
+        new ModelInformationItem("Minimum to instantiate", "vnfGroup-min", ['0'], "", false),
+        new ModelInformationItem("Maximum to instantiate", "vnfGroup-max", ['Unlimited'], "", false)
+        ];
+    })
+  }
+
+  getSubLeftTitle(): string {
+    return "VNF Group : " + this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].vnfGroups[this.uuidData['modelName']].name;
+  }
+
+  getSubRightTitle(): string {
+    return "VNF Group Instance Details";
+  }
+
+  storeVnfGroup = (that, formValues: any): void => {
+    formValues.modelInfo = new ModelInfo(that.model);
+    formValues.uuid = formValues.modelInfo.uuid;
+    formValues.isMissingData = false;
+    if(!that.isUpdateMode){
+      that._store.dispatch(changeInstanceCounter(formValues.modelInfo.modelCustomizationId || formValues.uuid, that.uuidData.serviceId, 1 , <any> {data: {type: 'VnfGroup'}}));
+      this._store.dispatch(createVnfGroupInstance(formValues, that.uuidData['modelName'], that.uuidData['serviceId'], that.uuidData['modelName']));
+    }else {
+      that._store.dispatch(updateVnfGroupInstance(formValues, that.uuidData.modelName, that.uuidData.serviceId, that.uuidData.vnfGroupStoreKey))
+    }
+  };
+
+  getTitle(isUpdateMode: boolean): string {
+    return isUpdateMode  ? "Edit VNF Group instance": "Set a new VNF Group" ;
+  }
+
+  onCancel(that, form): void {
+    form.reset();
+    that._iframeService.removeClassCloseModal('content');
+    this.closeDialogEvent.next(that);
+  }
+
+  onSubmit(that, form: FormGroup, ...args): void {
+    form.value['instanceParams'] = [{}];
+    that.storeVnfGroup(that, form.value);
+    window.parent.postMessage( {
+      eventId: 'submitIframe',
+      data: {
+        serviceModelId: that.uuidData.serviceId
+      }
+    }, "*");
+    that.onCancel(that, form);
+  }
+
+  extractSubscriberNameBySubscriberId(subscriberId: string, store: NgRedux<AppState>) {
+    let result: string = null;
+    let filteredArray: any = _.filter(store.getState().service.subscribers, function (o: Subscriber) {
+      return o.id === subscriberId
+    });
+    if (filteredArray.length > 0) {
+      result = filteredArray[0].name;
+    }
+    return result;
+  }
+
+}
index 08e199c..c610110 100644 (file)
@@ -30,7 +30,7 @@
 import { Component } from '@angular/core';
 import { MessageBoxData} from './messageBox.data';
 import { MessageBoxService } from './messageBox.service';
-import { SdcUiComponents } from 'sdc-ui/lib/angular';
+import { SdcUiServices} from "onap-ui-angular";
 
 @Component({
   selector: 'message-box',
@@ -38,12 +38,17 @@ import { SdcUiComponents } from 'sdc-ui/lib/angular';
 })
 
 export class MessageBoxComponent {
-  modalService: SdcUiComponents.ModalService;
-
-  constructor(modalService: SdcUiComponents.ModalService, private _messageBoxService : MessageBoxService) {
+  modalService: SdcUiServices.ModalService;
+  isOpened : boolean = false;
+  constructor(modalService: SdcUiServices.ModalService, private _messageBoxService : MessageBoxService) {
     this.modalService = modalService;
+
     MessageBoxService.openModal.subscribe((messageBoxData: MessageBoxData) => {
-      modalService.openModal(this._messageBoxService.setConfig(messageBoxData))
+      if(this.isOpened) return;
+      this.isOpened = true;
+      modalService.openModal(this._messageBoxService.setConfig(messageBoxData)).onDestroy(()=>{
+        this.isOpened = false;
+      })
     });
   }
 }
index 165140b..e67b1f7 100644 (file)
@@ -1,13 +1,14 @@
-import { Subject } from 'rxjs/Subject';
+import { SdcUiCommon} from "onap-ui-angular";
+import {IModalButtonComponent} from "onap-ui-angular/dist/modals/models/modal-config";
 
 export class  MessageBoxData {
   title?: string;
   message?: string;
-  size : ModalSize;
-  type: ModalType;
-  buttons: Array<IModalButtonComponent>;
+  size : SdcUiCommon.ModalSize;
+  type: SdcUiCommon.ModalType;
+  buttons: IModalButtonComponent[];
 
-  constructor(title: string, message: string, type: ModalType, size : ModalSize, buttons: Array<IModalButtonComponent>) {
+  constructor(title: string, message: string, type: SdcUiCommon.ModalType, size : SdcUiCommon.ModalSize, buttons: IModalButtonComponent[]) {
     this.title = title;
     this.message = message;
     this.size = size;
@@ -15,37 +16,3 @@ export class  MessageBoxData {
     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",
-}
-
-
-
index 89562ac..1d0e18f 100644 (file)
@@ -3,35 +3,37 @@ import {
   HttpClientTestingModule,
   HttpTestingController
 } from '@angular/common/http/testing';
-
 import { MessageBoxService } from './messageBox.service';
-import {MessageBoxData, ModalSize, ModalType } from './messageBox.data';
+import {MessageBoxData} from './messageBox.data';
+import { SdcUiCommon} from "onap-ui-angular";
 
 describe('MessageBoxService', () => {
   let injector;
   let service: MessageBoxService;
   let httpMock: HttpTestingController;
 
-  beforeEach(() => {
+  beforeAll(done => (async () => {
     TestBed.configureTestingModule({
       imports: [HttpClientTestingModule],
       providers: [MessageBoxService]
     });
+    await TestBed.compileComponents();
 
     injector = getTestBed();
     service = injector.get(MessageBoxService);
     httpMock = injector.get(HttpTestingController);
-  });
+
+  })().then(done).catch(done.fail));
 
   describe('#setConfig', () => {
-    it('should return <IModalConfig>', (done: DoneFn) => {
+    test('should return <IModalConfig>', () => {
       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,
+        SdcUiCommon.ModalType.warning,
+        SdcUiCommon.ModalSize.medium,
         [
           {text:"Stop Instantiation", size:"large", closeModal:true},
           {text:"Cancel", size:"medium", closeModal:true}
@@ -41,9 +43,8 @@ describe('MessageBoxService', () => {
       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();
+      expect(result.type).toEqual(SdcUiCommon.ModalType.warning);
+      expect(result.size).toEqual(SdcUiCommon.ModalSize.medium);
     });
   });
 });
index eaa012d..d73631a 100644 (file)
@@ -1,18 +1,18 @@
 import { Injectable } from '@angular/core';
 import { Subject } from 'rxjs/Subject';
-import { IModalConfig, MessageBoxData, ModalSize, ModalType } from './messageBox.data';
+import {MessageBoxData} from "./messageBox.data";
+import { SdcUiCommon} from "onap-ui-angular";
 
 @Injectable()
 export class MessageBoxService {
   static openModal: Subject<MessageBoxData> = new Subject<MessageBoxData>();
-  setConfig(messageBoxData: MessageBoxData) : IModalConfig{
+  setConfig(messageBoxData: MessageBoxData) : SdcUiCommon.IModalConfig{
     return {
-      size : ModalSize.medium,
+      size : SdcUiCommon.ModalSize.medium,
       title : messageBoxData.title,
       type : messageBoxData.type,
       message : messageBoxData.message,
       buttons: messageBoxData.buttons
     };
   }
-
 }
index fea4c44..9401aca 100644 (file)
@@ -1,5 +1,6 @@
 import {Component, Input} from '@angular/core';
-import * as _ from 'lodash';
+import {ModelInformationService} from "./model-information.service";
+
 
 @Component({
   selector: 'model-information',
@@ -8,17 +9,21 @@ import * as _ from 'lodash';
 })
 
 export class ModelInformationComponent {
-  private _modelInformationItems: Array<ModelInformationItem>;
 
+  constructor(private _modelInformationService : ModelInformationService){}
+
+  private _modelInformationItems: ModelInformationItem[];
+
+  @Input() itemClass: string = 'item'; //default class for item is "item"
 
-  get modelInformationItems(): Array<ModelInformationItem> {
+  get modelInformationItems(): ModelInformationItem[] {
     return this._modelInformationItems;
   }
 
   @Input()
-  set modelInformationItems(_modelInformationItems: Array<ModelInformationItem>) {
+  set modelInformationItems(_modelInformationItems: ModelInformationItem[]) {
     if (_modelInformationItems) {
-      this._modelInformationItems = _modelInformationItems.filter(x => x.mandatory || (!_.isEmpty(x.values) && !_.isEmpty(x.values[0])));
+      this._modelInformationItems = this._modelInformationService.filterModelItems(_modelInformationItems);
     }
   }
 }
@@ -27,11 +32,11 @@ export class ModelInformationComponent {
 export class ModelInformationItem {
   label: string;
   testsId: string;
-  values: Array<string>;
+  values: string[];
   toolTipText: string;
   mandatory: boolean;
 
-  constructor(label: string, testsId: string, values: Array<any>, toolTipText: string = "", mandatory: boolean = false,nested:boolean=false) {
+  constructor(label: string, testsId: string, values: any[], toolTipText: string = "", mandatory: boolean = false) {
     this.label = label;
     this.testsId = testsId;
     this.values = values;
@@ -39,4 +44,8 @@ export class ModelInformationItem {
     this.mandatory = mandatory;
   }
 
+  static createInstance(label: string, value: any):ModelInformationItem {
+    return new ModelInformationItem(label, label, [value]);
+  }
+
 }
index 456dfde..78548b0 100644 (file)
@@ -1,12 +1,12 @@
 <div id="model-information">
-  <div *ngFor="let item of modelInformationItems" class="item" attr.data-tests-id="model-item-{{item.label}}">
+  <div *ngFor="let item of modelInformationItems" ngClass={{itemClass}} 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 *ngFor="let value of item.values" class="model-item-value" 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.service.spec.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.service.spec.ts
new file mode 100644 (file)
index 0000000..418493f
--- /dev/null
@@ -0,0 +1,32 @@
+import {ModelInformationService} from "./model-information.service";
+import {ModelInformationItem} from "./model-information.component";
+
+describe('ModelInformationService', () => {
+  let underTest:ModelInformationService;
+
+  beforeEach(() => {
+    underTest = new ModelInformationService();
+  });
+
+  test('when call to filterModelItems then items with empty values are filtered', () =>{
+    expect(underTest.filterModelItems([
+      ModelInformationItem.createInstance("emptyValue", ""),
+      ModelInformationItem.createInstance("nullValue", null),
+      ModelInformationItem.createInstance("undefinedValue", undefined),
+      ModelInformationItem.createInstance("spacesValue", " "),
+      new ModelInformationItem("emptyArray", "id", [], "c", false)
+    ])).toHaveLength(0);
+  });
+
+  test('when call to filterModelItems then mandatory items with empty values are not filtered', () =>{
+    const mandatoryItem:ModelInformationItem = new ModelInformationItem("a", "b", [""], "c", true);
+    expect(underTest.filterModelItems([mandatoryItem])).toEqual([mandatoryItem]);
+  });
+
+  test('when call to filterModelItems then items with values are not filtered', () =>{
+    expect(underTest.filterModelItems([
+      ModelInformationItem.createInstance("withString", "a"),
+      ModelInformationItem.createInstance("withNumber", 1),
+    ])).toHaveLength(2);
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.service.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.service.ts
new file mode 100644 (file)
index 0000000..7c0a96b
--- /dev/null
@@ -0,0 +1,16 @@
+import {Injectable} from "@angular/core";
+import * as _ from 'lodash';
+import {ModelInformationItem} from "./model-information.component";
+
+@Injectable()
+export class ModelInformationService {
+
+  filterModelItems(_modelInformationItems: ModelInformationItem[]) {
+    return _modelInformationItems.filter(x => x.mandatory || (
+      !_.isEmpty(x.values)
+      && !_.isNil(x.values[0])
+      && x.values[0].toString().trim()!=""
+      ));
+  }
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.spec.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.spec.ts
new file mode 100644 (file)
index 0000000..cdba11f
--- /dev/null
@@ -0,0 +1,12 @@
+import {ModelInformationItem} from "./model-information.component";
+
+describe('ModelInformationItem', () => {
+  test('when use createInstance, values initialized as expected', () =>{
+    const modelInformationItem:ModelInformationItem = ModelInformationItem.createInstance("aStr", 4);
+    expect(modelInformationItem.label).toEqual("aStr");
+    expect(modelInformationItem.testsId).toEqual("aStr");
+    expect(modelInformationItem.values).toEqual([4]);
+    expect(modelInformationItem.mandatory).toBeFalsy();
+    expect(modelInformationItem.toolTipText).toEqual("");
+  });
+});
index bbe7bc7..1820028 100644 (file)
@@ -1,5 +1,6 @@
 <div class="width-100">
-  <div class="text-title" [ngClass]="titleClass">{{title}}</div>
-  <div class="text-subtitle" [ngClass]="subtitleClass">{{subtitle}}</div>
+  <div class="text-title" [ngClass]="titleClass" [attr.data-tests-id]="'text-title'">{{title}}</div>
+  <div class="text-title" [ngClass]="titleClass" [attr.data-tests-id]="'text-title2'">{{title2}}</div>
+  <div class="text-subtitle" [ngClass]="subtitleClass" [attr.data-tests-id]="'text-subtitle'">{{subtitle}}</div>
   <img  id="not-node-img-id" src="{{iconPath}}" alt="" class="no-content-icon" [ngClass]="iconClass" data-tests-id="no-content-icon">
 </div>
index 1320ef7..3829f06 100644 (file)
@@ -9,6 +9,7 @@
   font-size: 16px;
   color: #4A4A4A;
   text-align: center;
+  padding-bottom: 7px;
 }
 
 .text-subtitle {
@@ -16,7 +17,7 @@
   font-size: 16px;
   color: #959595;
   text-align: center;
-  margin-top: 7px;
+  margin-top: 2px;
 }
 
 .no-content-icon {
index c551559..4dc8096 100644 (file)
@@ -2,7 +2,10 @@
   triggers="mouseenter:mouseleave"
   popover="{{value}}"
   [hidden]="value == null"
-  container="body">
+  container="body"
+  containerClass="{{popoverType}}"
+  placement="{{placement}}"
+  [attr.data-tests-id]="'popover-test-id'">
   <ng-content ></ng-content>
 </div>
 
index d6a4c3a..9dbbe63 100644 (file)
@@ -1,17 +1,29 @@
 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;
-        }
-    `]
+  templateUrl: 'popover.component.html'
 })
 
-export class PopoverComponent {
-  @Input() value: String;
+export class PopoverComponent{
+  @Input() value: string;
+  @Input() extraStyle : string;
+  @Input() placement : string = PopoverPlacement.LEFT;
+  @Input() popoverType : string = PopoverType.CUSTOM;
+
+}
+
+export enum PopoverPlacement{
+  TOP = 'top',
+  BOTTOM = 'bottom',
+  LEFT = 'left',
+  RIGHT = 'right',
+  AUTO ='auto',
 }
+
+export enum PopoverType {
+  ERROR  = 'error',
+  WARNING = 'warning',
+  SUCCESS = 'success',
+  CUSTOM = 'custom'
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/member-table-row.model.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/member-table-row.model.ts
new file mode 100644 (file)
index 0000000..c5f1a7a
--- /dev/null
@@ -0,0 +1,6 @@
+import {VnfMember} from "../../../models/VnfMember";
+
+export class MemberTableRowModel  extends VnfMember{
+  isSelected : boolean = false;
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.html b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.html
new file mode 100644 (file)
index 0000000..3a29ed8
--- /dev/null
@@ -0,0 +1,75 @@
+<div class="table-header">
+  <div class="left-header">
+    <span class="title-header">{{description}}</span>
+    <div class="sub-title-header">
+      <span class="vnf-match-your-criteria" class="total" [attr.data-tests-id]="'total-amount'" style="margin-right: 5px;"><span
+        [attr.data-tests-id]="'numberOfNotHideVnfMembers'">{{membersTableService.numberOfNotHideVnfMembers}}</span> VNFs match your criteria</span>
+      <span class="vnf-selected" class="total" [attr.data-tests-id]="'total-selected'"><span
+        [attr.data-tests-id]="'numberOfSelectedVnfMembers'">{{membersTableService.numberOfSelectedVnfMembers}}</span> VNF{{membersTableService.numberOfSelectedVnfMembers>1?'s':'' }} selected</span>
+    </div>
+  </div>
+
+  <div class="search-container">
+    <sdc-filter-bar
+      [placeHolder]="'Search...'"
+      [debounceTime]="250"
+      [testId]="'vnf-members-search'"
+      (valueChange)="search($event)">
+    </sdc-filter-bar>
+  </div>
+</div>
+<table id="member-table" class="table table-bordered" *ngIf="data?.length > 0">
+  <thead class="thead-dark">
+  <tr>
+    <th class="allCheckboxAreSelected" style="position: relative;">
+      <sdc-checkbox
+        [(checked)]="membersTableService.allCheckboxAreSelected"
+        [testId]="'all-checkbox-selected'"
+        (checkedChange)="changeAllCheckboxStatus($event)"
+      ></sdc-checkbox>
+    </th>
+    <th class="header-title" *ngFor="let header of headers">{{header.displayName}}</th>
+  </tr>
+  </thead>
+  <tbody>
+  <tr class="member-table-row" *ngFor="let vnf of membersTableService.filteredMembers">
+    <td class="sdcCheckboxMember" style="position: relative;" [attr.data-tests-id]="vnf?.instanceId">
+      <sdc-checkbox
+        [checked]="membersTableService.allMemberStatusMap[vnf.instanceId]?.isSelected"
+        [testId]="vnf?.instanceId"
+        (checkedChange)="changeCheckboxStatus(vnf.instanceId)"
+      ></sdc-checkbox></td>
+    <td id="vnfName">
+      <custom-ellipsis [id]="vnf?.instanceName" [value]="vnf?.instanceName"
+                       [hightlight]="filterValue"></custom-ellipsis>
+      <custom-ellipsis class="second-line" [id]="vnf?.instanceId" [value]="'UUID: '+ vnf?.instanceId"
+                       [hightlight]="filterValue"></custom-ellipsis>
+    </td>
+    <td id="version">
+      <custom-ellipsis [id]="vnf?.modelInfo?.modelVersion" [value]="vnf?.modelInfo?.modelVersion" [hightlight]="filterValue"></custom-ellipsis>
+    </td>
+    <td id="modelName">
+      <custom-ellipsis [id]="vnf?.modelInfo?.modelName" [value]="vnf?.modelInfo?.modelName" [hightlight]="filterValue"></custom-ellipsis>
+    </td>
+    <td id="provStatus">
+      <custom-ellipsis [id]="vnf?.provStatus" [value]="vnf?.provStatus" [hightlight]="filterValue"></custom-ellipsis>
+    </td>
+    <td id="serviceInstance">
+      <custom-ellipsis [id]="vnf?.serviceInstanceName" [value]="vnf?.serviceInstanceName"
+                       [hightlight]="filterValue"></custom-ellipsis>
+      <custom-ellipsis class="second-line" [id]="vnf?.serviceInstanceId" [value]="'UUID: '+ vnf?.serviceInstanceId"
+                       [hightlight]="filterValue"></custom-ellipsis>
+    </td>
+    <td id="cloudRegion">
+      <custom-ellipsis [id]="vnf?.lcpCloudRegionId" [value]="vnf?.lcpCloudRegionId" [hightlight]="filterValue"></custom-ellipsis>
+    </td>
+    <td id="tenantName">
+      <custom-ellipsis [id]="vnf?.tenantName" [value]="vnf?.tenantName" [hightlight]="filterValue"></custom-ellipsis>
+    </td>
+  </tr>
+
+  </tbody>
+</table>
+<div class="no-result" *ngIf="data?.length == 0">No VNFs were found that can belong to this group.</div>
+
+
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.scss b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.scss
new file mode 100644 (file)
index 0000000..3be9752
--- /dev/null
@@ -0,0 +1,91 @@
+.table-header {
+  display: flex;
+  margin-bottom: 5px;
+  .left-header{
+    .title-header{
+      font-family: OpenSans-SemiBold;
+      color: #191919;
+      font-size: 15px;
+      margin-bottom: 5px;
+      display: block;
+    }
+
+    .sub-title-header{
+
+      .vnf-selected{
+        margin-left: 25px;
+      }
+
+      .vnf-match-your-criteria{
+      }
+    }
+    .total{
+      font-family: OpenSans-Regular;
+      color: #191919;
+      font-size: 15px;
+      margin-right: 10px;
+    }
+
+  }
+
+  .search-container{
+    flex-basis: 300px;
+    margin-left: auto;
+  }
+}
+
+#member-table>tbody+tbody {
+  border-top: 1px solid #ddd;
+}
+
+
+
+#member-table {
+  border: 1px solid #D2D2D2;
+  thead {
+    background: #F8F8F8;
+    th.allCheckboxAreSelected {
+      vertical-align: middle !important;
+      width: 48px;
+      max-width: 48px;
+      min-width: 48px;
+      height: 48px;
+    }
+    th.header-title {
+      font-family: OpenSans-SemiBold;
+      vertical-align: middle !important;
+      height: 48px;
+      font-size: 12px;
+    }
+  }
+  tbody {
+    td{
+      text-align: center;
+      height: 60px;
+      padding-top: 0;
+      padding-bottom: 0;
+      max-height: 60px;
+      vertical-align: middle;
+      .second-line {
+        font-size: 12px;
+      }
+    }
+  }
+
+
+  //font-size: 12px;
+
+  th.allCheckboxAreSelected {
+    text-align: center;
+  }
+}
+
+.no-result {
+  font-family: OpenSans-Regular;
+  width: 100%;
+  height: 100%;
+  border: 1px solid #d2d2d2;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.component.ts
new file mode 100644 (file)
index 0000000..9736563
--- /dev/null
@@ -0,0 +1,57 @@
+import {Component, Input, OnChanges, Output, SimpleChanges, EventEmitter} from '@angular/core';
+import {VnfMember} from "../../../models/VnfMember";
+import {MembersTableService} from "./members-table.service";
+import * as _ from 'lodash';
+
+export class CustomTableColumnDefinition {
+  public displayName = '';
+  public key : any = '';
+  public type? = 'text';
+  public filter? = '';
+}
+
+@Component({
+  selector: 'app-members-table',
+  templateUrl: './members-table.component.html',
+  styleUrls: ['./members-table.component.scss']
+})
+
+export class MembersTableComponent implements OnChanges{
+  filterValue: string = null;
+  allMemberStatusMap = null;
+  membersTableService : MembersTableService;
+  headers: CustomTableColumnDefinition[] = MembersTableService.getHeaders();
+  @Input() data: VnfMember[];
+  @Input() description: string;
+  @Output() selectedMembersAmountChange : EventEmitter<number> = new EventEmitter();
+  constructor(private _membersTableService : MembersTableService){
+    this.membersTableService = this._membersTableService;
+  }
+
+  ngOnChanges(changes: SimpleChanges): void {
+    if(_.isNil(this.data)){
+      this._membersTableService.resetAll();
+    }else {
+      this._membersTableService.allMemberStatusMap = MembersTableService.generateAllMembersStatus(this.data);
+      this._membersTableService.filteredMembers = MembersTableService.sortVnfMembersByName(this.data, "instanceName");
+      this._membersTableService.updateAmountsAndCheckAll();
+    }
+  }
+  
+  search(searchStr: string): void {
+    this.filterValue = searchStr;
+    this._membersTableService.filterMembers(this.filterValue);
+  }
+
+  changeAllCheckboxStatus(status: boolean) : void {
+    this._membersTableService.changeAllCheckboxStatus(status);
+    this.selectedMembersAmountChange.emit(this._membersTableService.numberOfSelectedVnfMembers);
+  }
+
+
+  changeCheckboxStatus(vnfInstanceId: string) : void {
+    this._membersTableService.changeCheckboxStatus(vnfInstanceId);
+    this.selectedMembersAmountChange.emit(this._membersTableService.numberOfSelectedVnfMembers);
+  }
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.spec.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.spec.ts
new file mode 100644 (file)
index 0000000..e53c63b
--- /dev/null
@@ -0,0 +1,270 @@
+import {MembersTableService} from "./members-table.service";
+import {TestBed, getTestBed} from "@angular/core/testing";
+import {NgRedux} from "@angular-redux/store";
+import {CustomTableColumnDefinition} from "./members-table.component";
+import {AppState} from "../../../store/reducers";
+import {createRelatedVnfMemberInstance} from "../../../storeUtil/utils/relatedVnfMember/relatedVnfMember.actions";
+import {DataFilterPipe} from "../../../pipes/dataFilter/data-filter.pipe";
+import {VnfMember} from "../../../models/VnfMember";
+
+
+
+class MockAppStore<T> {
+  dispatch() {
+  }
+  getState() {
+    return {
+      service : {
+        serviceHierarchy: {
+        },
+        serviceInstance : {
+          "serviceModelId" : {
+            vnfGroups:{
+              "aa1":{
+                vnfs:{
+                   "VNF1_INSTANCE_ID":{
+                      "action": "None",
+                      "instanceName": "VNF1_INSTANCE_NAME",
+                      "instanceId": "VNF1_INSTANCE_ID",
+                      "orchStatus": null,
+                      "lcpCloudRegionId": "mtn23b",
+                      "tenantId": "3e9a20a3e89e45f884e09df0cc2d2d2a",
+                      "tenantName": "APPC-24595-T-IST-02C",
+                      "modelInfo": {
+                      "modelInvariantId": "vnf-instance-model-invariant-id",
+                        "modelVersionId": "7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+                        "modelVersion": "2.0",
+                        "modelName": "vf_vEPDG",
+                        "modelType": "vnf"
+                    },
+                      "instanceType": "VNF1_INSTANCE_TYPE",
+                      "provStatus": null,
+                      "inMaint": false,
+                      "uuid": "7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+                      "trackById": "7a6ee536-f052-46fa-aa7e-2fca9d674c44:002",
+                      "serviceInstanceId": "service-instance-id1",
+                      "serviceInstanceName": "service-instance-name"
+
+                  },
+                  "aa1-vnf1":{
+                    vnfName: "",
+                    instanceId:"",
+                    serviceInstanceId:""
+                  }
+                }
+              }
+            }
+          }
+
+        }
+      }
+    }
+  }
+}
+
+describe('MembersTableService view member count', () => {
+  let injector;
+  let service: MembersTableService;
+  let store: NgRedux<AppState>;
+  let data = loadMockMembers();
+
+  beforeAll(done => (async () => {
+
+    TestBed.configureTestingModule(
+      {
+        providers: [
+          MembersTableService,
+          {provide: NgRedux, useClass: MockAppStore},
+          DataFilterPipe
+
+        ],
+        declarations: [DataFilterPipe]
+      });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(MembersTableService);
+    store = injector.get(NgRedux)
+
+  })().then(done).catch(done.fail));
+
+
+  test('should return number of displayed members', () => {
+    service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+    service.filteredMembers = <any>data;
+    expect(service.calculateNotHideVnfMembers()).toEqual(2);
+  });
+
+  test('should return number of selected members', () => {
+    service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+    service.allMemberStatusMap['VNF1_INSTANCE_ID'].isSelected = true;
+    service.allMemberStatusMap['VNF2_INSTANCE_ID'].isSelected = true;
+    expect(service.calculateSelectedVnfMembers()).toEqual(2);
+  });
+
+  test('should return number of selected members', () => {
+    service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+    service.filteredMembers = <any>data;
+    service.allMemberStatusMap['VNF1_INSTANCE_ID'].isSelected = true;
+    service.filterMembers('VNF2');
+    service.allMemberStatusMap['VNF2_INSTANCE_ID'].isSelected = true;
+    expect(service.calculateNotHideVnfMembers()).toEqual(1);
+  });
+
+  test('getHeader should return labels with array of keys', () => {
+    const headers: CustomTableColumnDefinition[] = MembersTableService.getHeaders();
+    expect(headers).toEqual([
+      {displayName: 'VNF instance name', key: ['instanceName']},
+      {displayName: 'VNF version', key: ['modelInfo', 'modelVersion']},
+      {displayName: 'VNF model name', key: ['modelInfo', 'modelName']},
+      {displayName: 'Prov Status', key: ['provStatus']},
+      {displayName: 'Service instance name', key: ['serviceInstanceName']},
+      {displayName: 'Cloud Region', key: ['lcpCloudRegionId']},
+      {displayName: 'Tenant Name', key: ['tenantName']}
+    ]);
+  });
+
+
+  test('setMembers should dispatch action only on selected members', () => {
+    const vnfGroupStoreKey: string = 'vnfGroupStoreKey';
+    const serviceId: string = 'serviceId';
+
+    jest.spyOn(store, 'dispatch');
+    service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+    service.allMemberStatusMap['VNF1_INSTANCE_ID'].isSelected = true;
+    service.setMembers({serviceId: serviceId, vnfGroupStoreKey: vnfGroupStoreKey});
+    expect(store.dispatch).toHaveBeenCalledTimes(1);
+    expect(store.dispatch).toHaveBeenCalledWith(createRelatedVnfMemberInstance(vnfGroupStoreKey, serviceId, service.allMemberStatusMap['VNF1_INSTANCE_ID']));
+  });
+
+  test('generateAllMembersStatus should add to each instance isHide and isSelected and convert to map', () => {
+
+    let allMemberStatusMapMock = MembersTableService.generateAllMembersStatus(<any>data);
+    for (const key in allMemberStatusMapMock) {
+      expect(allMemberStatusMapMock[key].isSelected).toBeFalsy();
+    }
+  });
+
+  test('changeAllCheckboxStatus', () => {
+    let data = loadMockMembers();
+    service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+    service.filteredMembers = <any>data;
+    service.changeAllCheckboxStatus(true);
+    for (let key in service.allMemberStatusMap) {
+      expect(service.allMemberStatusMap[key].isSelected).toEqual(true);
+    }
+  });
+
+  test('should reset all numbers and lists', () => {
+    let data = loadMockMembers();
+    service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>data);
+    service.filteredMembers = <any>data;
+    service.changeAllCheckboxStatus(true);
+    service.resetAll();
+    expect(service.numberOfNotHideVnfMembers).toEqual(0);
+    expect(service.numberOfSelectedAndNotHideVnfMembers).toEqual(0);
+    expect(service.numberOfSelectedVnfMembers).toEqual(0);
+    expect(service.allMemberStatusMap).toEqual({});
+    expect(service.filteredMembers.length).toEqual(0);
+  });
+
+  test('checkAllCheckboxStatus should be false if not all are selected', () => {
+    service.allMemberStatusMap = MembersTableService.generateAllMembersStatus(<any>loadMockMembers());
+    service.updateAmountsAndCheckAll();
+
+    expect(service.allCheckboxAreSelected).toEqual(false);
+  });
+
+
+  test('sortVnfMembersByName should sort list by vnf name', () => {
+    let data = <any>loadMockMembers();
+    let sortedList = MembersTableService.sortVnfMembersByName(data, "instanceName");
+
+    expect(sortedList[0].instanceName).toEqual("VNF1_INSTANCE_NAME");
+    expect(sortedList[1].instanceName).toEqual("VNF2_INSTANCE_NAME");
+
+    let tmp = data[0];
+    data[0] = data[1];
+    data[1] = tmp;
+
+    sortedList = MembersTableService.sortVnfMembersByName(data, "instanceName");
+
+    expect(sortedList[1].instanceName).toEqual("VNF1_INSTANCE_NAME");
+    expect(sortedList[0].instanceName).toEqual("VNF2_INSTANCE_NAME");
+    sortedList = MembersTableService.sortVnfMembersByName(null, "instanceName");
+    expect(sortedList).toEqual([]);
+    sortedList = MembersTableService.sortVnfMembersByName(data, undefined);
+    expect(sortedList).toEqual([]);
+  });
+
+  test('should return only vnf members not associated to any vnf group', ()=>{
+    const result: VnfMember[] = service.filterUsedVnfMembers("serviceModelId",loadMockMembers());
+    expect(result.length).toEqual(1);
+    expect(result[0].instanceId).toEqual("VNF2_INSTANCE_ID");
+  });
+
+});
+
+
+function loadMockMembers(): any[] {
+  return [
+    {
+      "action": "None",
+      "instanceName": "VNF1_INSTANCE_NAME",
+      "instanceId": "VNF1_INSTANCE_ID",
+      "orchStatus": null,
+      "productFamilyId": null,
+      "lcpCloudRegionId": "mtn23b",
+      "tenantId": "3e9a20a3e89e45f884e09df0cc2d2d2a",
+      "tenantName": "APPC-24595-T-IST-02C",
+      "modelInfo": {
+        "modelInvariantId": "vnf-instance-model-invariant-id",
+        "modelVersionId": "7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+        "modelVersion": "2.0",
+        "modelName": "vf_vEPDG",
+        "modelType": "vnf"
+      },
+      "instanceType": "VNF1_INSTANCE_TYPE",
+      "provStatus": null,
+      "inMaint": false,
+      "uuid": "7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+      "originalName": null,
+      "legacyRegion": null,
+      "lineOfBusiness": null,
+      "platformName": null,
+      "trackById": "7a6ee536-f052-46fa-aa7e-2fca9d674c44:002",
+      "serviceInstanceId": "service-instance-id1",
+      "serviceInstanceName": "service-instance-name"
+    },
+    {
+      "action": "None",
+      "instanceName": "VNF2_INSTANCE_NAME",
+      "instanceId": "VNF2_INSTANCE_ID",
+      "orchStatus": null,
+      "productFamilyId": null,
+      "lcpCloudRegionId": "mtn23b",
+      "tenantId": "3e9a20a3e89e45f884e09df0cc2d2d2a",
+      "tenantName": "APPC-24595-T-IST-02C",
+      "modelInfo": {
+        "modelInvariantId": "vnf-instance-model-invariant-id",
+        "modelVersionId": "eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+        "modelVersion": "1.0",
+        "modelName": "vf_vEPDG",
+        "modelType": "vnf"
+      },
+      "instanceType": "VNF2_INSTANCE_TYPE",
+      "provStatus": null,
+      "inMaint": true,
+      "uuid": "eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+      "originalName": null,
+      "legacyRegion": null,
+      "lineOfBusiness": null,
+      "platformName": null,
+      "trackById": "eb5f56bf-5855-4e61-bd00-3e19a953bf02:003",
+      "serviceInstanceId": "service-instance-id2",
+      "serviceInstanceName": "service-instance-name"
+    }
+  ];
+}
+
+
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/members-table/members-table.service.ts
new file mode 100644 (file)
index 0000000..5b9cd39
--- /dev/null
@@ -0,0 +1,153 @@
+import {Injectable} from "@angular/core";
+import {VnfMember} from "../../../models/VnfMember";
+import {CustomTableColumnDefinition} from "./members-table.component";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../store/reducers";
+import {createRelatedVnfMemberInstance} from "../../../storeUtil/utils/relatedVnfMember/relatedVnfMember.actions";
+import * as _ from 'lodash';
+import {DataFilterPipe} from "../../../pipes/dataFilter/data-filter.pipe";
+import {MemberTableRowModel} from "./member-table-row.model";
+
+@Injectable()
+export class MembersTableService {
+  allMemberStatusMap : { [key:string]: MemberTableRowModel; };
+  filteredMembers :  VnfMember[];
+  allCheckboxAreSelected : boolean;
+  numberOfNotHideVnfMembers : number;
+  numberOfSelectedVnfMembers : number;
+  numberOfSelectedAndNotHideVnfMembers : number;
+
+  constructor(private _store: NgRedux<AppState>, private dataFilter: DataFilterPipe){
+    this.resetAll();
+  }
+
+   filterUsedVnfMembers = (serviceModelId: string, result: VnfMember[]): VnfMember[] => {
+    const allMembersMap =  _.keyBy(result as VnfMember[], 'instanceId');
+    const vnfGroupsData = this._store.getState().service.serviceInstance[serviceModelId].vnfGroups;
+    const vnfMembersArr = _.flatMap(vnfGroupsData).map((vnfGroup) =>vnfGroup.vnfs );
+    for( let vnf of vnfMembersArr ){
+      for(let member in vnf){
+        delete allMembersMap[member];
+      }
+    }
+    return _.flatMap(allMembersMap);
+  };
+
+  updateAmountsAndCheckAll = () : void => {
+    this.numberOfSelectedVnfMembers = this.calculateSelectedVnfMembers();
+    this.numberOfNotHideVnfMembers = this.calculateNotHideVnfMembers();
+    this.numberOfSelectedAndNotHideVnfMembers = this.calculateSelectedAndNotHide();
+    this.allCheckboxAreSelected = this.numberOfNotHideVnfMembers > 0 && this.numberOfNotHideVnfMembers === this.numberOfSelectedAndNotHideVnfMembers;
+  };
+
+  resetAll = () : void => {
+    this.allMemberStatusMap = {};
+    this.filteredMembers = [];
+    this.numberOfSelectedVnfMembers = 0;
+    this.numberOfNotHideVnfMembers = 0;
+    this.numberOfSelectedAndNotHideVnfMembers = 0;
+    this.allCheckboxAreSelected = false;
+  };
+
+  changeAllCheckboxStatus = (status : boolean) : void =>{
+    for(const member of this.filteredMembers){
+        this.allMemberStatusMap[member.instanceId].isSelected = status;
+      }
+    this.updateAmountsAndCheckAll();
+  };
+
+  changeCheckboxStatus = (vnfInstanceId : string ) : void =>{
+    this.allMemberStatusMap[vnfInstanceId].isSelected = !this.allMemberStatusMap[vnfInstanceId].isSelected;
+    this.updateAmountsAndCheckAll();
+  };
+
+  /************************************************
+   iterate over all current vnf members:
+   1) if vnf member is selected then update REDUX store
+   2) if vnf member is not selected then delete member
+   @allMemberStatusMap: current vnf member status
+   @vnfGroupStoreKey: vnf group store key
+   @serviceId: service model id
+   ************************************************/
+  setMembers = (data : {serviceId : string, vnfGroupStoreKey : string}) : void =>{
+    let tmpMembers = this.allMemberStatusMap;
+    for(let key in tmpMembers){
+      if(tmpMembers[key].isSelected){
+        this._store.dispatch(createRelatedVnfMemberInstance( data.vnfGroupStoreKey, data.serviceId, tmpMembers[key]));
+      }
+    }
+  };
+
+  filterMembers(searchStr: string): void {
+    const keys: string[][] =  MembersTableService.getDataKeys();
+    this.filteredMembers = this.dataFilter.transform(_.values(this.allMemberStatusMap), searchStr || '', keys);
+    this.updateAmountsAndCheckAll();
+  }
+
+  /************************************
+   generate  vnf member data for select/ unselect rows
+   ************************************/
+  static generateAllMembersStatus(tableData : VnfMember[]) : { [key:string]: MemberTableRowModel; }{
+
+    tableData.map((vnf) => {
+      vnf['isSelected'] = false
+    });
+    return _.keyBy(tableData as MemberTableRowModel[], 'instanceId');
+  }
+
+
+  static sortVnfMembersByName(list : VnfMember[], keyName : string) :VnfMember[]{
+    if(!_.isNil(list) && !_.isNil(keyName)) {
+      return list.sort(function(itemA, itemB) { return itemA[keyName]- itemB[keyName];})
+    }
+    return [];
+
+  }
+
+  /********************************
+   table columns headers and key's
+   ********************************/
+  static getHeaders() : CustomTableColumnDefinition[] {
+    return  [
+      {displayName: 'VNF instance name', key: ['instanceName']},
+      {displayName: 'VNF version', key: ['modelInfo', 'modelVersion']},
+      {displayName: 'VNF model name', key: ['modelInfo', 'modelName']},
+      {displayName: 'Prov Status', key: ['provStatus']},
+      {displayName: 'Service instance name', key: ['serviceInstanceName']},
+      {displayName: 'Cloud Region', key: ['lcpCloudRegionId']},
+      {displayName: 'Tenant Name', key: ['tenantName']}
+    ];
+  }
+
+  static getDataKeys(): string[][]{
+    const headers = MembersTableService.getHeaders();
+    return headers.map((header)=> header.key).concat([['instanceId']],[['serviceInstanceId']]);
+  }
+
+  /*************************************************************************************
+   calculate the number of selected vnf members - include not visible and visible rows
+   @allMemberStatusMap: current vnf member status
+   *************************************************************************************/
+  calculateSelectedVnfMembers() : number {
+    const flatObject = _.values(this.allMemberStatusMap);
+    return  _.filter(flatObject, (item) => { if (item.isSelected) return item }).length;
+  }
+
+  /************************************************
+   calculate the number of display vnf members
+   @allMemberStatusMap: current vnf member status
+   ************************************************/
+  calculateNotHideVnfMembers() : number {
+    return this.filteredMembers.length;
+  }
+
+  /************************************************
+   calculate the number of display vnf members
+   @allMemberStatusMap: current vnf member status
+   ************************************************/
+  calculateSelectedAndNotHide() : number {
+    return  _.filter(this.filteredMembers, (item) => { if ( this.allMemberStatusMap[item.instanceId].isSelected) return item }).length;
+  }
+
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.html b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.html
new file mode 100644 (file)
index 0000000..899bc98
--- /dev/null
@@ -0,0 +1,35 @@
+<div class="modal-search-member-content">
+  <div class="header">
+    <vid-svg-icon
+      [attr.data-tests-id]="'cancelBtn'"
+      (click)="closeDialog()"
+      class="navigation-arrow-back"
+      [mode]="'primary'"
+      [size]="'large'"
+      [name]="'navigation-arrow-back'"
+      [clickable]="true"
+      [fill]="'#FFFFFF'"
+      [widthViewBox]="'24'"
+      [heightViewBox]="'24'">
+    </vid-svg-icon>
+
+    <span class="title">
+      {{title}}
+    </span>
+    <button type="submit" data-tests-id="setMembersBtn" [disabled]="disableSetMembers" (click)="setMembers()" class="sdc-button sdc-button__primary">SET MEMBERS</button>
+  </div>
+  <div class="content-wrapper">
+    <div class="sidebar-left">
+      <div class="search-criteria-wrapper">
+        <div class="search-criteria-title">SEARCH CRITERIA</div>
+         <div class="search-item" *ngFor="let searchFieldItem of searchFields">
+           <span class="label-item">{{searchFieldItem.title}}</span>
+           <span attr.data-tests-id="{{searchFieldItem.dataTestId}}" class="text-item">{{searchFieldItem.value}}</span>
+         </div>
+      </div>
+    </div>
+    <div class="sidebar-right">
+      <app-members-table [data]="membersData" [description]="description" (selectedMembersAmountChange)="selectedMembersAmountChange($event)"></app-members-table>
+    </div>
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.scss b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.scss
new file mode 100644 (file)
index 0000000..d496539
--- /dev/null
@@ -0,0 +1,89 @@
+.modal-search-member-content {
+  height: 100vh;
+  width: 100vw;
+  position: relative;
+  background: white;
+  .header {
+    height: 60px;
+    font-family: OpenSans-Regular;
+    display: -webkit-box;
+    display: flex;
+    font-size: 14px;
+    box-shadow: 2px 2px 6px #D2D2D2;
+    color: white;
+    background: #009fdb;
+    z-index: 1;
+    position: relative;
+    .navigation-arrow-back {
+      border-right: 1px solid #1eb9f3;
+      width: 60px;
+      height: 60px;
+      cursor: pointer;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+    .title {
+      font-size: 18px;
+      line-height: 60px;
+      margin-left: 20px;
+    }
+    button {
+      width: 125px;
+      font-family: OpenSans-Regular;
+      font-size: 14px;
+      margin-left: auto;
+      margin-right: 20px;
+      margin-top: 12px;
+      border: 1px solid white;
+      &:disabled {
+        opacity: 0.5;
+        background: none;
+      }
+    }
+  }
+
+  .content-wrapper {
+    display: flex;
+
+    .sidebar-left {
+      flex-basis: 285px;
+      border-right: 1px solid #D2D2D2;
+      height: calc(100vh - 60px);
+
+      .search-criteria-wrapper{
+
+        .search-criteria-title{
+          font-family: OpenSans-SemiBold;
+          font-size: 14px;
+          color: #191919;
+          border-bottom: 1px solid #D2D2D2;
+          line-height: 50px;
+          padding-left: 30px;
+        }
+        .search-item{
+          color: #191919;
+          display: flex;
+          flex-direction: column;
+          margin: 25px 30px;
+          .label-item {
+            font-family: OpenSans-SemiBold;
+            font-size: 12px;
+          }
+          .text-item{
+            font-family: OpenSans-Regular;
+            font-size: 14px;
+            color: #5a5a5a;
+            word-break: break-all;
+          }
+
+        }
+      }
+    }
+
+    .sidebar-right {
+      flex: 1;
+      margin: 80px 50px;
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.ts b/vid-webpack-master/src/app/shared/components/searchMembersModal/search-members-modal.component.ts
new file mode 100644 (file)
index 0000000..9c65d22
--- /dev/null
@@ -0,0 +1,82 @@
+import {Component, OnDestroy, OnInit, ViewChild} from '@angular/core';
+import {DialogComponent, DialogService} from "ng2-bootstrap-modal";
+import {IframeService} from "../../utils/iframe.service";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {VnfMember} from "../../models/VnfMember";
+import {VnfGroupModel} from "../../models/vnfGroupModel";
+import {MembersTableService} from "./members-table/members-table.service";
+import {VnfGroupInstance} from "../../models/vnfGroupInstance";
+
+
+export interface PopupModel {
+  title: string;
+  serviceModelId : string;
+  searchFields: ISearchField[];
+  description : string;
+  subscriberId: string,
+  serviceType: string,
+  node: VnfGroupInstance,
+  vnfGroupModel: VnfGroupModel;
+
+}
+
+export interface ISearchField {
+  title: string;
+  value: any;
+  dataTestId: string;
+}
+
+@Component({
+  selector : 'search-members-modal',
+  templateUrl : 'search-members-modal.component.html',
+  styleUrls : ['search-members-modal.component.scss']
+})
+
+export class SearchMembersModalComponent extends DialogComponent<PopupModel, boolean> implements OnInit, OnDestroy {
+  title: string;
+  serviceModelId : string;
+  parentElementClassName = 'content';
+  membersData: VnfMember[];
+  description : string;
+  searchFields: ISearchField[];
+  vnfGroupModel: VnfGroupModel;
+  subscriberId: string;
+  serviceType: string;
+  node: VnfGroupInstance;
+  disableSetMembers: boolean = true;
+    constructor(dialogService:  DialogService ,
+              private _iframeService : IframeService,
+              private _aaiService : AaiService,
+              private _membersTableService: MembersTableService){
+    super(dialogService);
+
+  }
+  @ViewChild('MembersTableComponent') membersTable;
+
+   ngOnInit() : void{
+    this._aaiService.getOptionalGroupMembers(this.serviceModelId, this.subscriberId, this.serviceType, (Object.values(this.vnfGroupModel.members))[0].sourceModelInvariant, this.vnfGroupModel.properties.type, this.vnfGroupModel.properties.role)
+      .subscribe((result: VnfMember[])=>{
+        this.membersData = this._membersTableService.filterUsedVnfMembers(this.serviceModelId, result);
+      });
+    };
+
+
+  closeDialog() : void{
+    this._iframeService.removeClassCloseModal(this.parentElementClassName);
+    this.dialogService.removeDialog(this);
+    setTimeout(() => {
+      window.parent.postMessage("closeIframe", "*");
+    }, 15);
+  }
+  selectedMembersAmountChange(selectedMembersAmount: number) : void {
+    this.disableSetMembers = selectedMembersAmount==0;
+  }
+
+
+  setMembers() : void {
+    this._membersTableService.setMembers({serviceId : this.serviceModelId, vnfGroupStoreKey : this.node.vnfGroupStoreKey});
+    this.closeDialog();
+  }
+}
+
+
index cb11fee..238f769 100644 (file)
@@ -1,2 +1,6 @@
-<div *ngIf="show"
-     class="spinner"></div>
+<sdc-loader name= "global"
+            #globalLoader
+            [global] = "global"
+            [size]="size"
+            [(active)] = "show"></sdc-loader>
+
index 531ee8c..57f7b00 100644 (file)
@@ -1,42 +1,50 @@
-import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {ComponentFixture, TestBed} from '@angular/core/testing';
 import {HttpClientTestingModule} from '@angular/common/http/testing';
-import { SpinnerComponent } from './spinner.component';
+import {SpinnerComponent, SpinnerInfo} from './spinner.component';
+import {CUSTOM_ELEMENTS_SCHEMA} from "@angular/core";
 
 describe('Spinner component', () => {
   let component: SpinnerComponent;
   let fixture: ComponentFixture<SpinnerComponent>;
 
-  beforeEach(async(() => {
+  beforeAll(done => (async () => {
     TestBed.configureTestingModule({
       imports: [HttpClientTestingModule],
       providers: [],
-      declarations: [SpinnerComponent ]
-    })
-      .compileComponents();
-  }));
+      declarations: [SpinnerComponent],
+      schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
+    });
+    await TestBed.compileComponents();
 
-  beforeEach(() => {
     fixture = TestBed.createComponent(SpinnerComponent);
     component = fixture.componentInstance;
     fixture.detectChanges();
-  });
 
-  it('component should be defined', () => {
+  })().then(done).catch(done.fail));
+
+
+
+  test('component should be defined', () => {
     expect(component).toBeDefined();
   });
 
-
-  it('component constructor should subscribe of showSpinner event with true', ()=> {
-    SpinnerComponent.showSpinner.next(true);
+  test('component constructor should subscribe of showSpinner event with true', ()=> {
+    let spinnerInfo : SpinnerInfo = new SpinnerInfo(true, 'someUrl', 'json');
+    SpinnerComponent.showSpinner.next(spinnerInfo);
     expect(component.show).toBeTruthy();
   });
 
-  it('component constructor should subscribe of showSpinner event with false', ()=> {
-    SpinnerComponent.showSpinner.next(false);
+  test('component constructor should subscribe of showSpinner event with true and then to be false', ()=> {
+    let spinnerInfo : SpinnerInfo = new SpinnerInfo(true, 'someUrl', 'json');
+    SpinnerComponent.showSpinner.next(spinnerInfo);
+    spinnerInfo  = new SpinnerInfo(false, 'someUrl', 'json');
+    SpinnerComponent.showSpinner.next(spinnerInfo);
     expect(component.show).toBeFalsy();
   });
 
-
-
-
+  test('component constructor should subscribe of showSpinner event with false', ()=> {
+    let spinnerInfo : SpinnerInfo = new SpinnerInfo(false, 'someUrl', 'json');
+    SpinnerComponent.showSpinner.next(spinnerInfo);
+    expect(component.show).toBeFalsy();
+  });
 });
index 0ce5d20..94a0e1c 100644 (file)
@@ -1,18 +1,50 @@
-import { Component, Input } from '@angular/core';
-import { Subject } from 'rxjs/Subject';
+import {Component} from '@angular/core';
+import {Subject} from 'rxjs/Subject';
+import * as _ from 'lodash';
 
 @Component({
   selector : 'spinner-component',
-  templateUrl : './spinner.component.html',
-  styleUrls : ['./spinner.component.scss']
+  templateUrl: './spinner.component.html',
+  styleUrls : ['./spinner.component.scss'],
+  providers : []
+
 })
-export class SpinnerComponent {
-  show : boolean = false;
-  static showSpinner: Subject<boolean> = new Subject<boolean>();
+export class SpinnerComponent{
+  show : boolean;
+  size = "large";
+  global = true;
+
+  requestMap = {};
+
+  static showSpinner: Subject<SpinnerInfo> = new Subject<SpinnerInfo>();
 
   constructor(){
-    SpinnerComponent.showSpinner.subscribe((status) => {
-      this.show = status;
+    SpinnerComponent.showSpinner.subscribe((spinnerInfo) => {
+      let status = spinnerInfo['status'];
+      let requestType = spinnerInfo['requestType'];
+      let requestUrl = spinnerInfo['requestUrl'];
+
+      if(status && requestType === 'json'){
+        this.requestMap[requestUrl] = true;
+      }else {
+        delete this.requestMap[requestUrl]
+      }
+      console.log(this.requestMap);
+      this.show = !_.isEmpty(this.requestMap) && this.requestMap !== undefined;
+
     })
   }
 }
+
+
+export class SpinnerInfo {
+  status : boolean;
+  requestUrl : string;
+  requestType : string;
+
+  constructor(status : boolean, requestUrl : string, requestType : string){
+    this.status = status;
+    this.requestUrl = requestUrl;
+    this.requestType = requestType;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/svg/svg-component.ts b/vid-webpack-master/src/app/shared/components/svg/svg-component.ts
new file mode 100644 (file)
index 0000000..2e46424
--- /dev/null
@@ -0,0 +1,47 @@
+import {
+  AfterViewChecked,
+  Component,
+  ElementRef,
+  EventEmitter,
+  Input,
+  Output
+} from "@angular/core";
+import * as _ from 'lodash';
+
+@Component({
+  selector : 'vid-svg-icon',
+  template: `    
+      <svg-icon
+        [mode]="mode"
+        [size]="size"
+        [name]="name"
+        [testId]="testId"
+        [clickable]="clickable">
+    </svg-icon>
+  `,
+
+
+})
+export class SvgComponent implements AfterViewChecked{
+  @Input() mode : string = 'primary';
+  @Input() size : string = 'large';
+  @Input() testId : string = null;
+  @Input() name : string = null;
+  @Input() clickable : boolean = false;
+  @Input() fill : string ;
+  @Input() widthViewBox: string = null;
+  @Input() heightViewBox: string = null;
+
+  constructor(private elRef: ElementRef) {}
+
+  ngAfterViewChecked(): void {
+    if(!_.isNil(this.fill)){
+      this.elRef.nativeElement.children[0].children[0].children[0].style.fill = this.fill;
+    }
+
+    if(this.widthViewBox && this.heightViewBox){
+      this.elRef.nativeElement.children[0].children[0].children[0].setAttribute('viewBox', "1 1 " + this.widthViewBox + " " + this.heightViewBox)
+    }
+
+  }
+}
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
deleted file mode 100644 (file)
index ec9f3f7..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-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
deleted file mode 100644 (file)
index 418bdfc..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-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/clickOutside/clickOutside.directive.spec.ts b/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.spec.ts
new file mode 100644 (file)
index 0000000..8edfb87
--- /dev/null
@@ -0,0 +1,52 @@
+import {ComponentFixture, TestBed} from '@angular/core/testing';
+import {Component, DebugElement} from "@angular/core";
+import {By} from "@angular/platform-browser";
+import {ClickOutsideDirective} from "./clickOutside.directive";
+
+@Component({
+  template:
+      `<div id="innerDiv" [clickOutside] [classElements]="['outsideDivShouldNotTrigger']"></div>
+       <div class="outsideDivShouldTrigger"></div>
+       <div class="outsideDivShouldNotTrigger"></div>`
+})
+class TestHoverFocusComponent {
+}
+
+
+describe('Click outside Directive', () => {
+  let component: TestHoverFocusComponent;
+  let fixture: ComponentFixture<TestHoverFocusComponent>;
+  let directiveInstance : ClickOutsideDirective;
+  let outsideDivShouldNotTrigger: DebugElement;
+  let outsideDivShouldTrigger: DebugElement;
+  let innerDiv: DebugElement;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      declarations: [TestHoverFocusComponent, ClickOutsideDirective]
+    });
+    fixture = TestBed.createComponent(TestHoverFocusComponent);
+    component = fixture.componentInstance;
+    outsideDivShouldNotTrigger = fixture.debugElement.query(By.css('.outsideDivShouldNotTrigger'));
+    outsideDivShouldTrigger = fixture.debugElement.query(By.css('.outsideDivShouldTrigger'));
+    innerDiv = fixture.debugElement.query(By.css('#innerDiv'));
+    directiveInstance = innerDiv.injector.get(ClickOutsideDirective);
+  });
+
+  test('directive should be defined', () => {
+    expect(directiveInstance).toBeDefined();
+  });
+
+  test(`should have list of class's`, () => {
+    fixture.detectChanges();
+    expect(directiveInstance.classElements).toEqual(['outsideDivShouldNotTrigger']);
+  });
+
+  test('should not trigger output on click outside', () => {
+    fixture.detectChanges();
+    spyOn(directiveInstance.clickOutsideTrigger, 'next');
+    outsideDivShouldNotTrigger.nativeElement.click();
+    expect(directiveInstance.clickOutsideTrigger.next).toHaveBeenCalledTimes(0);
+  });
+
+});
diff --git a/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.ts b/vid-webpack-master/src/app/shared/directives/clickOutside/clickOutside.directive.ts
new file mode 100644 (file)
index 0000000..1a43a3e
--- /dev/null
@@ -0,0 +1,41 @@
+import {Directive, EventEmitter, HostListener, Input, Output} from "@angular/core";
+import * as _ from 'lodash';
+/**********************************************************************
+  Click outside directive
+  can get one list of class's or id's (Not together)
+  if all elements are not the target then clickOutside is trigger
+ *******************************************************************/
+@Directive({
+  selector : '[clickOutside]'
+})
+export class ClickOutsideDirective {
+  @Input() clickOutside : string;
+  @Input() classElements : string[] = [];
+  @Input() idElements : string[] = [];
+  @Output() public clickOutsideTrigger: EventEmitter<any> = new EventEmitter();
+
+  @HostListener('document:click', ['$event.target']) public onClick(targetElement) {
+    if(!_.isNil(this.classElements)){this.hostListener(targetElement, this.classElements, 'getElementsByClassName');}
+    if(!_.isNil(this.idElements)){this.hostListener(targetElement, this.idElements, 'getElementById');}
+  }
+
+
+/********************************************************************************
+ hostListener - iterate over all elements and check if the element is the target.
+ @param targetElement - the target element
+ @param elements - elements to check
+ @param documentMethod - method to find the element in dom
+ ********************************************************************************/
+hostListener(targetElement, elements, documentMethod): void{
+  let result = true;
+for(let i = 0 ; i < elements.length; i++){
+  const classElements = document[documentMethod](elements[i]);
+  for (let j = 0 ; j < classElements.length; j++){
+    const clickedInside = document[documentMethod](elements[i])[j].contains(targetElement);
+    if(clickedInside) return;
+    result = result && clickedInside;
+  }
+}
+if (!result) {this.clickOutsideTrigger.emit(null); }
+}
+}
index 846ff70..ec5bfd8 100644 (file)
@@ -1,19 +1,18 @@
-import {TestBed, ComponentFixture} from '@angular/core/testing';
+import {ComponentFixture, TestBed} from '@angular/core/testing';
 import {Component, DebugElement} from "@angular/core";
 import {By} from "@angular/platform-browser";
-import { InputPreventionPatternDirective } from './inputPreventionPattern.directive';
+import {InputPreventionPatternDirective} from './inputPreventionPattern.directive';
 
 @Component({
-  template: `<input 
+  template: `<input
     patternInput
-    pattern="^[a-zA-Z0-9_]*$">`
+    pattern="^[a-zA-Z0-9._-]*$">`
 })
 class TestHoverFocusComponent {
 }
 
 
 describe('InputPrevention Pattern Directive', () => {
-
   let component: TestHoverFocusComponent;
   let fixture: ComponentFixture<TestHoverFocusComponent>;
   let directiveInstance : InputPreventionPatternDirective;
@@ -29,37 +28,54 @@ describe('InputPrevention Pattern Directive', () => {
     directiveInstance = inputEl.injector.get(InputPreventionPatternDirective);
   });
 
-  it('directive should be defined', () => {
+  test('directive should be defined', () => {
     expect(directiveInstance).toBeDefined();
   });
 
-  it('pattern exists', () => {
-    expect(inputEl.nativeElement.pattern).toEqual('^[a-zA-Z0-9_]*$');
+  test('pattern exists', () => {
+    expect(inputEl.nativeElement.pattern).toEqual('^[a-zA-Z0-9._-]*$');
   });
 
-  it('kepress legal input', () => {
+  test('kepress legal input', () => {
     fixture.detectChanges();
     inputEl.nativeElement.value = "legalInput";
     expect(new RegExp(inputEl.nativeElement.pattern).test(inputEl.nativeElement.value)).toBeTruthy();
   });
 
-  it('kepress illegal input', () => {
+  test('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' };
+
+  test('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);
+  });
+
+
+  test('kepress event legal(-) input should return event', () => {
+    const event = <any>{ key: '-'};
     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 = "-";
+  test('kepress event legal (.) input should return event', () => {
+    const event = <any>{ key: '.'};
+    inputEl.nativeElement.value = "legalInput";
+    let result = directiveInstance.onKeypress(event);
+    expect(result).toBe(event);
+  });
+
+
+  test('kepress event illegal input should prevent default', () => {
+    const event = <any>{key: '$', preventDefault : function () {} };
+    jest.spyOn(event, 'preventDefault');
+    inputEl.nativeElement.value = "$";
     let result = directiveInstance.onKeypress(event);
     expect(event.preventDefault).toHaveBeenCalled();
   });
index dada09b..d00c525 100644 (file)
@@ -1,18 +1,10 @@
-import {Directive, ElementRef} from '@angular/core';
+import {Directive, ElementRef, HostBinding, HostListener} from '@angular/core';
 
 @Directive({
-  selector: '[patternInput]',
-  host: {
-    '(keypress)': 'onKeypress($event)'
-  }
+  selector: '[patternInput]'
 })
 export class InputPreventionPatternDirective{
-  inputElement : ElementRef;
-  constructor(el: ElementRef) {
-    this.inputElement = el;
-  }
-
-  onKeypress(event: KeyboardEvent) {
+  @HostListener('keypress', ['$event']) onKeypress(event: KeyboardEvent) {
     const pattern = new RegExp(this.inputElement.nativeElement.pattern);
     if(pattern){
       if(!pattern.test(event['key'])){
@@ -21,4 +13,9 @@ export class InputPreventionPatternDirective{
     }
     return event;
   }
+
+  inputElement : ElementRef;
+  constructor(el: ElementRef) {
+    this.inputElement = el;
+  }
 }
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
deleted file mode 100644 (file)
index e69de29..0000000
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
deleted file mode 100644 (file)
index e4dc55a..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-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
deleted file mode 100644 (file)
index 68fada6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-export * from './api.service';
index f72b32d..945c69b 100644 (file)
@@ -2,7 +2,9 @@ export enum ServiceNodeTypes {
   VF = "VF",
   VFmodule = "VFmodule",
   Network = "Network",
-  Configuration = "Configuration"
+  VL = 'VL',
+  Configuration = "Configuration",
+  VnfGroup = 'VnfGroup'
 }
 
 
diff --git a/vid-webpack-master/src/app/shared/models/VnfMember.ts b/vid-webpack-master/src/app/shared/models/VnfMember.ts
new file mode 100644 (file)
index 0000000..392f8dd
--- /dev/null
@@ -0,0 +1,11 @@
+import {Level1Instance} from "./level1Instance";
+
+export class VnfMember extends Level1Instance{
+  serviceInstanceName: string;
+  serviceInstanceId: string;
+  tenantName: string;
+  constructor(){
+    super();
+  }
+
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/checkboxFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/checkboxFormControl.model.ts
new file mode 100644 (file)
index 0000000..f505b56
--- /dev/null
@@ -0,0 +1,11 @@
+import {FormControlModel} from "./formControl.model";
+import {FormControlType} from "./formControlTypes.enum";
+
+export class CheckboxFormControl extends FormControlModel{
+
+  constructor(data) {
+    super(data);
+    this.type = FormControlType.CHECKBOX;
+    this.validations = [];
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/dropdownFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/dropdownFormControl.model.ts
new file mode 100644 (file)
index 0000000..ba3e860
--- /dev/null
@@ -0,0 +1,29 @@
+import {FormControlModel} from "./formControl.model";
+import {FormGroup} from "@angular/forms";
+import {FormControlType} from "./formControlTypes.enum";
+import {Observable} from "rxjs";
+
+export class DropdownFormControl extends FormControlModel{
+  options$ : Observable<any[]> = null;
+  args : string[];
+  onInit: (data : DropdownFormControl, form: FormGroup) => Observable<any>;
+  selectedField : string;
+  onInitSelectedField : string[]; // key that should select from API response.
+  ngValue : string;
+  name : string;
+  hasEmptyOptions : boolean; // get empty result from API or REDUX.
+
+
+  constructor(data) {
+    super(data);
+    this.type = FormControlType.DROPDOWN;
+    this.options$ = data.options ? data.options$ : null;
+    this.onInit = data.onInit;
+    this.selectedField = data.selectedField;
+    this.onInitSelectedField = data.onInitSelectedField ? data.onInitSelectedField : null;
+    this.ngValue = data.selectedField ? data.selectedField : 'id';
+    this.name = data.name;
+    this.hasEmptyOptions = false;
+  }
+
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/fileFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/fileFormControl.model.ts
new file mode 100644 (file)
index 0000000..7803fab
--- /dev/null
@@ -0,0 +1,18 @@
+import {CustomValidatorOptions, FormControlModel, ValidatorModel} from "./formControl.model";
+import {FormControlType} from "./formControlTypes.enum";
+import {InputFormControl} from "./inputFormControl.model";
+
+export class FileFormControl extends FormControlModel{
+  acceptedExtentions : String;
+  selectedFile : String;
+  onDelete? :Function;
+  hiddenFile: InputFormControl[];
+  constructor(data) {
+    super(data);
+    this.type = FormControlType.FILE;
+    this.selectedFile = data.selectedFile ? data.selectedFile : data.placeHolder;
+    this.acceptedExtentions = data.acceptedExtentions ? data.acceptedExtentions : '';
+    this.onDelete = data.onDelete ? data.onDelete : function () {};
+    this.hiddenFile = data.hiddenFile;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/formControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/formControl.model.ts
new file mode 100644 (file)
index 0000000..2411654
--- /dev/null
@@ -0,0 +1,121 @@
+import {FormGroup, ValidatorFn, Validators} from "@angular/forms";
+import {Subject} from "rxjs/Subject";
+import {FormControlType} from "./formControlTypes.enum";
+import {CustomValidators} from "../../validators/uniqueName/uniqueName.validator";
+import * as _ from 'lodash';
+
+export class  FormControlModel {
+  formGroup : FormGroup;
+  controlName : string;
+  type : FormControlType;
+  displayName : string;
+  dataTestId : string;
+  placeHolder? : string;
+  tooltip? :string;
+  isDisabled? : boolean;
+  validations? : ValidatorModel[];
+  isVisible? : boolean;
+  value? : any;
+  originalValue?: any;
+  minLength?: number;
+  maxLength?: number;
+  onChange? : Function;
+  onBlur? : Function;
+  preventionsAttribute : AttributeMap[] = [];
+  waitFor? : Subject<string>[] = [];
+  hasErrors : () =>  string[];
+
+
+  constructor(data: any){
+    this.type = data.type;
+    this.displayName = data.displayName;
+    this.dataTestId = data.dataTestId;
+    this.placeHolder = data.placeHolder;
+    this.tooltip = data.tooltip;
+    this.isDisabled = data.isDisabled || false;
+    this.validations = data.validations || [];
+    this.isVisible = !_.isNil(data.isVisible)  ? data.isVisible : true;
+    this.value = data.value;
+    this.originalValue = data.value;
+    this.controlName = data.controlName;
+    this.minLength = data.minLength;
+    this.maxLength = data.maxLength;
+    this.preventionsAttribute = data.preventionsAttribute || [];
+    this.onBlur = function(){};
+    this.onChange = data.onChange ? data.onChange: function () {}
+  }
+
+  isRequired() : boolean {
+    for(let validtorsModel of this.validations){
+      let required = 'required';
+      if(validtorsModel.validatorName.toString() === required){
+        return true;
+      }
+    }
+    return false;
+  }
+
+  getPreventionAttribute() : AttributeMap[] {
+    let result : AttributeMap[] = [new AttributeMap('data-tests-id', this.dataTestId)];
+    return this.preventionsAttribute.concat(result);
+  }
+}
+
+
+
+export class ValidatorModel {
+  validator : ValidatorFn;
+  validatorArg? : any;
+  validatorName : ValidatorOptions | CustomValidatorOptions;
+  errorMsg : string;
+
+  constructor(validatorName : ValidatorOptions | CustomValidatorOptions, errorMsg : string, validatorArg: any = null){
+    this.validatorName = validatorName;
+    this.validator = this.setValidator(validatorName, validatorArg);
+    this.errorMsg = errorMsg;
+    this.validatorArg = validatorArg;
+  }
+
+
+  setValidator(validatorName : ValidatorOptions | CustomValidatorOptions, validatorArg: any = null) : ValidatorFn {
+    if(validatorName in ValidatorOptions){
+      return validatorArg ? Validators[validatorName](validatorArg) : Validators[validatorName];
+    }else {
+      return validatorArg ? CustomValidators[CustomValidatorOptions[validatorName]].apply(this, validatorArg) : CustomValidators[CustomValidatorOptions[validatorName]];
+    }
+  }
+}
+
+
+
+export enum ValidatorOptions {
+  required = 'required',
+  minLength = 'minLength',
+  maxLength = 'maxLength',
+  pattern = 'pattern',
+  nullValidator = 'nullValidator'
+}
+
+
+
+export enum CustomValidatorOptions {
+  uniqueInstanceNameValidator = 'uniqueInstanceNameValidator',
+  emptyDropdownOptions = 'emptyDropdownOptions',
+  isValidJson = 'isValidJson',
+  isFileTooBig = 'isFileTooBig',
+  isStringContainTags = 'isStringContainTags'
+}
+
+export class AttributeMap {
+  key : string;
+  value : string;
+
+  constructor(key : string, value? : string){
+    this.key = key;
+    this.value = value ? value : '';
+  }
+}
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/formControlTypes.enum.ts b/vid-webpack-master/src/app/shared/models/formControlModels/formControlTypes.enum.ts
new file mode 100644 (file)
index 0000000..eba1b08
--- /dev/null
@@ -0,0 +1,8 @@
+export enum FormControlType{
+  MULTI_SELECT = 'MULTI_SELECT',
+  FILE = 'FILE',
+  NUMBER = 'NUMBER',
+  INPUT = 'INPUT',
+  DROPDOWN = 'DROPDOWN',
+  CHECKBOX = 'CHECKBOX'
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/formPopupDetails.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/formPopupDetails.model.ts
new file mode 100644 (file)
index 0000000..8ea3d2d
--- /dev/null
@@ -0,0 +1,55 @@
+import {FormControlModel} from "./formControl.model";
+import {ModelInformationItem} from "../../components/model-information/model-information.component";
+import {FormGroup} from "@angular/forms";
+
+export class FormPopupDetails {
+  popupTypeName: PopupType;
+  that : any;
+  UUIDData : Object = {}; // TODO uuid tree
+  title: string;
+  leftSubTitle: string;
+  rightSubTitle: string;
+  formControlList: FormControlModel[];
+  dynamicInputsControlList: FormControlModel[];
+  modelInformationItems: ModelInformationItem[];
+  onSubmit : (that : any, form: FormGroup , ...args) =>  void;
+  onCancel : (that : any, form: FormGroup) => void;
+
+  constructor(that : any,
+              popupTypeName : PopupType ,
+              UUIDData : Object,
+              title : string,
+              leftSubTitle : string,
+              rightSubTitle : string,
+              formControlList : FormControlModel[],
+              dynamicInputsControlList : FormControlModel[],
+              modelInformationItems : ModelInformationItem[],
+              onSubmit : (that : any, form : FormGroup, ...args) =>  void,
+              onCancel : (that : any, form : FormGroup) => void){
+    this.title = title;
+    this.leftSubTitle = leftSubTitle;
+    this.rightSubTitle = rightSubTitle;
+    this.formControlList = formControlList;
+    this.dynamicInputsControlList = dynamicInputsControlList;
+    this.modelInformationItems = modelInformationItems;
+    this.onSubmit = onSubmit;
+    this.onCancel = onCancel;
+    this.popupTypeName = popupTypeName;
+    this.UUIDData = UUIDData;
+    this.that = that;
+  }
+}
+
+
+
+export enum PopupType {
+  SERVICE_MACRO = 'service macro',
+  SERVICE_A_LA_CART = 'service a-la-cart',
+  SERVICE = 'service',
+  VNF_MACRO  ='vnf macro',
+  VNF_A_LA_CARTE = 'vnf a-la-carte',
+  VFMODULE = 'vfModule',
+  NETWORK_MACRO = 'network_macro',
+  VNF_GROUP = 'vnfGroup'
+}
+
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/inputFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/inputFormControl.model.ts
new file mode 100644 (file)
index 0000000..99210af
--- /dev/null
@@ -0,0 +1,19 @@
+import {FormControlModel} from "./formControl.model";
+import {FormControlType} from "./formControlTypes.enum";
+
+export class InputFormControl extends FormControlModel {
+  onBlur ?: Function;
+  onKeypress?: Function;
+  inputType: string = 'text';
+  pattern: string;
+  preventions: string[];
+
+  constructor(data) {
+    super(data);
+    this.type = FormControlType.INPUT;
+    this.pattern = data.pattern;
+    this.onKeypress = data.onKeypress ? data.onKeypress : ()=>{}
+    this.onBlur = data.onBlur ? data.onBlur : ()=>{}
+  }
+}
+
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/multiselectFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/multiselectFormControl.model.ts
new file mode 100644 (file)
index 0000000..b137451
--- /dev/null
@@ -0,0 +1,27 @@
+import {FormControlModel} from "./formControl.model";
+import {Observable} from "rxjs";
+import {FormGroup} from "@angular/forms";
+import {FormControlType} from "./formControlTypes.enum";
+
+export class MultiselectFormControl extends FormControlModel{
+  options$ : Observable<any[]>;
+  args : string[];
+  onInit: (data : MultiselectFormControl, form: FormGroup) => Observable<any>;
+  selectedItems : string;
+  onInitSelectedItems : string[];
+  ngValue : string;
+  settings: {};
+
+
+  constructor(data) {
+    super(data);
+    this.type = FormControlType.MULTI_SELECT;
+    this.options$ = data.options;
+    this.onInit = data.onInit;
+    this.selectedItems = data.selectedItems;
+    this.onInitSelectedItems = data.onInitSelectedItems ? data.onInitSelectedItems : null;
+    this.ngValue = data.selectedField ? data.selectedField : 'id';
+    this.settings = data.settings || {};
+  }
+
+}
diff --git a/vid-webpack-master/src/app/shared/models/formControlModels/numberFormControl.model.ts b/vid-webpack-master/src/app/shared/models/formControlModels/numberFormControl.model.ts
new file mode 100644 (file)
index 0000000..5de38e2
--- /dev/null
@@ -0,0 +1,16 @@
+import {FormControlModel} from "./formControl.model";
+import {FormControlType} from "./formControlTypes.enum";
+
+export class NumberFormControl extends FormControlModel{
+  min: number;
+  max: number;
+
+
+  constructor(data) {
+    super(data);
+    this.type = FormControlType.NUMBER;
+    this.min = data.min;
+    this.max = data.max;
+  }
+
+}
index 1f7222f..542c13b 100644 (file)
@@ -1,11 +1,11 @@
 export enum  InputType {
-  LCP_REGION = "LCP_REGION",
-  TENANT = "TENANT",
-  LOB  = "LOB",
-  PLATFORM = "PLATFORM",
-  ROLLBACK = "ROLLBACK",
-  PRODUCT_FAMILY = "PRODUCT_FAMILY",
-  VG = "VG"
+  LCP_REGION = "lcpCloudRegionId",
+  TENANT = "tenantId",
+  LOB  = "lineOfBusiness",
+  PLATFORM = "platformName",
+  ROLLBACK = "rollbackOnFailure",
+  PRODUCT_FAMILY = "productFamilyId",
+  VG = "volumeGroupName"
 
 }
 
index e39321d..fe82a3e 100644 (file)
@@ -2,10 +2,12 @@ export class LcpRegion {
   id: string;
   name: string;
   isPermitted: boolean;
+  cloudOwner: string;
 
-  constructor(serviceJson){
-    this.id = serviceJson["cloudRegionID"];
-    this.name = serviceJson["cloudRegionID"];
-    this.isPermitted = serviceJson["is-permitted"];
+  constructor(id: string, name: string, isPermitted: boolean, cloudOwner: string) {
+    this.id = id;
+    this.name = name;
+    this.isPermitted = isPermitted;
+    this.cloudOwner = cloudOwner;
   }
 }
diff --git a/vid-webpack-master/src/app/shared/models/level1Instance.ts b/vid-webpack-master/src/app/shared/models/level1Instance.ts
new file mode 100644 (file)
index 0000000..b7925b8
--- /dev/null
@@ -0,0 +1,24 @@
+import {ChildNodeInstance} from "./nodeInstance";
+import {DefaultDataGeneratorService} from "../services/defaultDataServiceGenerator/default.data.generator.service";
+
+export class Level1Instance extends ChildNodeInstance{
+  uuid : string;
+  isEcompGeneratedNaming: boolean;
+  productFamilyId: string;
+  lcpCloudRegionId: string;
+  legacyRegion: string;
+  tenantId: string;
+  platformName: string;
+  lineOfBusiness: string;
+  rollbackOnFailure: string;
+  originalName: string;
+
+  constructor() {
+    super();
+    this.rollbackOnFailure = 'true';
+    this.originalName = null;
+    this.isMissingData= false;
+    this.trackById = DefaultDataGeneratorService.createRandomTrackById();
+    this.inMaint= false;
+  }
+}
index 091c02e..eb599cb 100644 (file)
@@ -1,11 +1,13 @@
 
 export class ModelInfo {
-  modelInvariantId: string;
-  modelVersionId: string;
+  modelInvariantId?: string;
+  modelVersionId?: string;
   modelName: string;
   modelVersion: string;
-  modelCustomizationId: string;
-  modelCustomizationName: string;
+  modelCustomizationId?: string;
+  modelCustomizationName?: string;
+  uuid? : string;
+  modelUniqueId?: String;
 
 
 
@@ -16,6 +18,8 @@ export class ModelInfo {
     this.modelVersion = instanceModel.version;
     this.modelCustomizationId = instanceModel.customizationUuid;
     this.modelCustomizationName = instanceModel.modelCustomizationName;
+    this.uuid = instanceModel.uuid;
+    this.modelUniqueId = this.modelCustomizationId||this.uuid;
   }
 }
 
diff --git a/vid-webpack-master/src/app/shared/models/networkInstance.ts b/vid-webpack-master/src/app/shared/models/networkInstance.ts
new file mode 100644 (file)
index 0000000..ded95a7
--- /dev/null
@@ -0,0 +1,14 @@
+
+
+import {Level1Instance} from "./level1Instance";
+
+export class NetworkInstance extends Level1Instance{
+  networkStoreKey : string;
+  isFailed: boolean;
+  statusMessage?: string;
+
+  constructor() {
+    super();
+    this.networkStoreKey = null;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/networkModel.ts b/vid-webpack-master/src/app/shared/models/networkModel.ts
new file mode 100644 (file)
index 0000000..03f118e
--- /dev/null
@@ -0,0 +1,32 @@
+import {
+  Level1Model, Level1ModelProperties,
+  Level1ModelResponseInterface
+} from "./nodeModel";
+import {VfcInstanceGroupMap} from "./vfcInstanceGroupMap";
+
+
+export interface NetworkProperties extends Level1ModelProperties{
+  ecomp_generated_naming: string;
+  network_role: string;
+}
+
+export interface NetworkModelResponseInterface extends Level1ModelResponseInterface{
+  properties: NetworkProperties;
+}
+
+export class NetworkModel extends Level1Model{
+
+  roles: string[] = [];
+  properties: NetworkProperties;
+
+  constructor(networkJson?: NetworkModelResponseInterface){
+    super(networkJson);
+    if(networkJson && networkJson.properties){
+      this.properties = networkJson.properties;
+      // expecting network_role to be a comma-saparated list
+      this.roles = networkJson.properties.network_role ? networkJson.properties.network_role.split(',') : [];
+    }
+  }
+
+
+}
diff --git a/vid-webpack-master/src/app/shared/models/networkTreeNode.ts b/vid-webpack-master/src/app/shared/models/networkTreeNode.ts
new file mode 100644 (file)
index 0000000..d09d5e4
--- /dev/null
@@ -0,0 +1,23 @@
+import {NetworkInstance} from "./networkInstance";
+import {TreeNodeModel} from "./treeNodeModel";
+import {Level1Model} from "./nodeModel";
+
+
+
+export class NetworkTreeNode extends TreeNodeModel {
+  networkStoreKey : string;
+  typeName: string;
+  menuActions: { [p: string]: { method: Function; visible: Function; enable: Function } };
+  isFailed: boolean;
+  statusMessage?: string;
+
+  constructor(instance: NetworkInstance, networkModel: Level1Model, networkStoreKey : string){
+    super(instance, networkModel);
+    this.name = instance.instanceName? instance.instanceName: !networkModel.isEcompGeneratedNaming ? networkModel.modelCustomizationName : '&lt;Automatically Assigned&gt;';
+    this.modelName = networkModel.modelCustomizationName;
+    this.type = networkModel.type;
+    this.isEcompGeneratedNaming = networkModel.isEcompGeneratedNaming;
+    this.networkStoreKey = networkStoreKey;
+  }
+}
+
diff --git a/vid-webpack-master/src/app/shared/models/nodeInstance.ts b/vid-webpack-master/src/app/shared/models/nodeInstance.ts
new file mode 100644 (file)
index 0000000..7656a0c
--- /dev/null
@@ -0,0 +1,21 @@
+import {ServiceInstanceActions} from "./serviceInstanceActions";
+import {ModelInfo} from "./modelInfo";
+
+export class NodeInstance {
+  instanceName: string;
+  orchStatus?:string;
+  action: ServiceInstanceActions = ServiceInstanceActions.Create;
+  originalAction : ServiceInstanceActions;
+  modelInfo?: ModelInfo;
+  instanceId?: string;
+  trackById?: string;
+}
+export class ChildNodeInstance extends NodeInstance {
+  isMissingData: boolean;
+  provStatus?:string;
+  inMaint?:boolean;
+  constructor() {
+    super();
+    this.inMaint = false;
+  }
+}
index 4b22b8d..ee57ec0 100644 (file)
@@ -1,12 +1,27 @@
+import {VfcInstanceGroupMap} from "./vfcInstanceGroupMap";
+
 export interface NodeModelResponseInterface {
+  customizationUuid: string;
   name: string;
   version: string;
   description: string;
   category: string;
   uuid: string;
   invariantUuid: string;
+  max: number;
+  min:number;
+}
+export interface Level1ModelResponseInterface extends NodeModelResponseInterface{
+  serviceType: string;
+  serviceRole: string;
+  subCategory: string;
+  customizationUuid: string;
+  serviceEcompNaming: boolean;
+  type: string;
+  modelCustomizationName: string;
+  vfcInstanceGroups: VfcInstanceGroupMap;
+  properties: Level1ModelProperties;
 }
-
 export class NodeModel {
   name: string;
   version: string;
@@ -14,16 +29,65 @@ export class NodeModel {
   category: string;
   uuid: string;
   invariantUuid: string;
+  max: number;
+  min: number;
+  customizationUuid?: string;
 
   constructor(serviceJson?: NodeModelResponseInterface) {
     if (serviceJson) {
+      this.customizationUuid = serviceJson.customizationUuid;
       this.name = serviceJson.name;
       this.version = serviceJson.version;
       this.description = serviceJson.description;
       this.category = serviceJson.category;
       this.uuid = serviceJson.uuid;
       this.invariantUuid = serviceJson.invariantUuid;
+      this.max = serviceJson.max;
+      this.min = serviceJson.min;
     }
   }
 
 }
+export class Level1ModelProperties {
+  max_instances : number;
+  min_instances : number;
+}
+
+
+
+export class Level1Model extends NodeModel{
+  serviceType: string;
+  serviceRole: string;
+  subCategory: string;
+  customizationUuid: string;
+  serviceEcompNaming: boolean;
+  type: string;
+  modelCustomizationName: string;
+  vfcInstanceGroups: VfcInstanceGroupMap;
+  isEcompGeneratedNaming: boolean;
+  constructor(nodeJson?: Level1ModelResponseInterface) {
+    super(nodeJson);
+    if (nodeJson) {
+      this.serviceType = nodeJson.serviceType;
+      this.serviceRole = nodeJson.serviceRole;
+      this.subCategory = nodeJson.subCategory;
+      this.customizationUuid = nodeJson.customizationUuid;
+      this.isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(nodeJson);
+      this.type = nodeJson.type;
+      this.modelCustomizationName = nodeJson.modelCustomizationName;
+      this.vfcInstanceGroups = nodeJson.vfcInstanceGroups;
+      this.max = 1;
+      this.min = 0;
+      if (nodeJson.properties) {
+        this.min = nodeJson.properties.min_instances || 0;
+        this.max = nodeJson.properties.max_instances || 1;
+      }
+
+
+    }
+  }
+  private getIsEcompGeneratedNaming(vnfJson) {
+    const ecompGeneratedNaming = vnfJson.properties.ecomp_generated_naming;
+    return ecompGeneratedNaming === "true";
+  };
+}
index 3c55ac0..1ed2579 100644 (file)
@@ -1,4 +1,4 @@
-import {ServiceResponseInterface} from "../../services/aaiService/responseInterfaces/getServicesResponseInterface";
+import {ServiceResponseInterface} from "../services/aaiService/responseInterfaces/getServicesResponseInterface";
 
 export class ProductFamily {
   id: string;
index a952430..38b4ac3 100644 (file)
@@ -1,8 +1,11 @@
 import {VnfInstance} from "./vnfInstance";
+import {NetworkInstance} from "./networkInstance";
+import {NodeInstance} from "./nodeInstance";
+import {VnfGroupInstance} from "./vnfGroupInstance";
+import {VnfMember} from "./VnfMember";
 
-export class ServiceInstance {
-  instanceName: string;
-  isUserProvidedNaming: boolean;
+export class ServiceInstance extends NodeInstance{
+  isEcompGeneratedNaming: boolean;
   globalSubscriberId: string;
   productFamilyId: string;
   subscriptionServiceType: string;
@@ -16,13 +19,37 @@ export class ServiceInstance {
   owningEntityName: string;
   pause: boolean;
   bulkSize: number;
-  vnfs: { [vnf_module_model_name: string] : VnfInstance; };
-  instanceParams: { [key: string] : string; };
-  rollbackOnFailure : boolean;
-  subscriberName : string;
+  vnfs: { [vnf_module_model_name: string]: VnfInstance; };
+  vnfGroups : {[vnf_module_model_name: string]: VnfGroupInstance; };
+  networks: { [vnf_module_model_name: string]: NetworkInstance; };
+  isDirty : boolean;
+  instanceParams: {[key: string]: string}[];
+  rollbackOnFailure: boolean;
+  subscriberName: string;
+  validationCounter: number;
+  existingNames:  {[key: string] : any};
+  modelInavariantId?: string;
+  existingVNFCounterMap : { [vnf_module_model_name: string]: number; };
+  existingVnfGroupCounterMap : { [vnf_group_module_model_name: string]: number; };
+  existingNetworksCounterMap : { [network_module_model_name: string]: number; };
+  optionalGroupMembersMap?: { [path: string]: VnfMember[]; };
+  isFailed: boolean;
+  statusMessage: string;
 
   constructor() {
+    super();
+    this.isDirty = false;
     this.vnfs = {};
-    this.instanceParams = {};
+    this.instanceParams = [];
+    this.validationCounter = 0;
+    this.existingNames = {};
+    this.existingVNFCounterMap = {};
+    this.existingVnfGroupCounterMap = {};
+    this.existingNetworksCounterMap = {};
+    this.optionalGroupMembersMap = {};
+    this.networks = {};
+    this.vnfGroups = {};
+    this.bulkSize = 1;
   }
+
 }
diff --git a/vid-webpack-master/src/app/shared/models/serviceInstanceActions.ts b/vid-webpack-master/src/app/shared/models/serviceInstanceActions.ts
new file mode 100644 (file)
index 0000000..783f133
--- /dev/null
@@ -0,0 +1,24 @@
+export enum ServiceInstanceActions{
+  Delete = "Delete",
+  Update="Update",
+  Create="Create",
+  None="None",
+  Update_Delete = 'Update_Delete',
+  None_Delete = 'None_Delete'
+}
+export enum ServiceAction {
+  INSTANTIATE = 'INSTANTIATE',
+  DELETE = 'DELETE',
+  UPDATE = 'UPDATE'
+}
+export enum JobStatus {
+  COMPLETED = 'COMPLETED',
+  FAILED = 'FAILED',
+  IN_PROGRESS = 'IN_PROGRESS',
+  RESOURCE_IN_PROGRESS = 'RESOURCE_IN_PROGRESS',
+  PAUSE = 'PAUSE',
+  PENDING = 'PENDING',
+  STOPPED = 'STOPPED',
+  COMPLETED_WITH_ERRORS = 'COMPLETED_WITH_ERRORS',
+  CREATING = 'CREATING'
+}
index 18d8582..21a34cc 100644 (file)
@@ -7,6 +7,7 @@ export interface ServiceModelResponseInterface extends NodeModelResponseInterfac
   serviceType: string;
   serviceRole: string;
   serviceEcompNaming: boolean;
+  vidNotions: any;
 }
 
 export class ServiceModel extends NodeModel{
@@ -14,8 +15,9 @@ export class ServiceModel extends NodeModel{
   serviceType: string;
   serviceRole: string;
   servicesQty: number;
-  isUserProvidedNaming: boolean;
+  isEcompGeneratedNaming: boolean;
   isMultiStepDesign: boolean;
+  vidNotions?: any;
 
   constructor(serviceModelJson?: any){
     super(serviceModelJson.service);
@@ -23,13 +25,14 @@ export class ServiceModel extends NodeModel{
       const service: ServiceModelResponseInterface = serviceModelJson.service;
       this.serviceType = service.serviceType;
       this.serviceRole = service.serviceRole;
-      this.isUserProvidedNaming = this.getIsUserProvidedName(service);
+      this.vidNotions= service.vidNotions;
+      this.isEcompGeneratedNaming = this.getServiceEcompNaming(service);
       this.isMultiStepDesign = this.getIsMultiStepDesign(serviceModelJson);
     }
   }
 
-  private getIsUserProvidedName(serviceJson): boolean {
-    return serviceJson.serviceEcompNaming !== undefined && serviceJson.serviceEcompNaming === "false";
+  private getServiceEcompNaming(serviceJson): boolean {
+    return serviceJson.serviceEcompNaming === "true";
   };
 
   private getIsMultiStepDesign(serviceModel): boolean {
diff --git a/vid-webpack-master/src/app/shared/models/serviceProxyModel.ts b/vid-webpack-master/src/app/shared/models/serviceProxyModel.ts
new file mode 100644 (file)
index 0000000..31810ca
--- /dev/null
@@ -0,0 +1,22 @@
+
+import {NodeModel, NodeModelResponseInterface} from "./nodeModel";
+
+export interface ServiceProxyModelResponseInterface extends NodeModelResponseInterface{
+  sourceModelUuid: string;
+  sourceModelInvariant: string;
+  sourceModelName: string;
+}
+export class ServiceProxyModel extends NodeModel {
+  sourceModelUuid: string;
+  sourceModelInvariant: string;
+  sourceModelName: string;
+
+  constructor(serviceProxyJson?: ServiceProxyModelResponseInterface)  {
+    if (serviceProxyJson)  {
+      super(serviceProxyJson);
+      this.sourceModelUuid = serviceProxyJson.sourceModelUuid;
+      this.sourceModelInvariant = serviceProxyJson.sourceModelInvariant;
+      this.sourceModelName = serviceProxyJson.sourceModelName;
+    }
+  }
+}
index 234f1db..26ff69d 100644 (file)
@@ -2,10 +2,12 @@ export class Tenant {
   id: string;
   name: string;
   isPermitted: boolean;
+  cloudOwner: string;
 
   constructor(serviceJson){
     this.id = serviceJson["tenantID"];
     this.name = serviceJson["tenantName"];
     this.isPermitted = serviceJson["is-permitted"];
+    this.cloudOwner = serviceJson["cloudOwner"];
   }
 }
diff --git a/vid-webpack-master/src/app/shared/models/treeNodeModel.ts b/vid-webpack-master/src/app/shared/models/treeNodeModel.ts
new file mode 100644 (file)
index 0000000..2be8b80
--- /dev/null
@@ -0,0 +1,53 @@
+import {ChildNodeInstance} from "./nodeInstance";
+import {NodeModel} from "./nodeModel";
+import {ServiceNodeTypes} from "./ServiceNodeTypes";
+import * as _ from 'lodash';
+import {ServiceInstanceActions} from "./serviceInstanceActions";
+export enum TreeLevel {
+  Level_0 , Level_1, Level_2
+
+}
+interface TreeNodeInstanceInterface {
+  treeLevel: TreeLevel;
+  getModel(): NodeModel;
+  convertToTreeNode(node: any): any;
+  type: ServiceNodeTypes;
+}
+export class TreeNodeModel {
+  type: String;
+  modelId: string;
+  modelCustomizationId?: string;
+  modelUniqueId?: string;
+  id: string;
+  name: string;
+  modelName: string;
+  missingData: boolean;
+  isEcompGeneratedNaming: boolean;
+  orchStatus?:string;
+  provStatus?:string;
+  inMaint?:boolean;
+  action : string ;
+
+  constructor(instance: ChildNodeInstance, nodeModel: NodeModel){
+    this.modelCustomizationId = nodeModel.customizationUuid;
+    this.modelId = nodeModel.uuid;
+    this.modelUniqueId = this.modelCustomizationId || this.modelId;
+    this.missingData = false;
+    this.id = instance.trackById;
+    this.action = !_.isNil(instance.action) ? instance.action : ServiceInstanceActions.Create;
+
+    if(!_.isNil(instance.orchStatus)){
+      this.orchStatus= instance.orchStatus;
+    }
+
+    if(!_.isNil(instance.provStatus)){
+      this.provStatus= instance.provStatus;
+    }
+
+    if(!_.isNil(instance.inMaint)){
+      this.inMaint= instance.inMaint;
+    }
+
+
+  }
+}
index 21f43ed..c752021 100644 (file)
@@ -1,7 +1,7 @@
 import {NodeModel, NodeModelResponseInterface} from "./nodeModel";
 
 
-export interface properties{
+export interface Properties{
   initialCount: number;
   maxCountInstances: number;
   minCountInstances: number;
@@ -10,24 +10,25 @@ export interface properties{
 export interface VFModuleResponseInterface extends NodeModelResponseInterface {
   customizationUuid: string;
   modelCustomizationName: string;
-  properties: properties
+  volumeGroupAllowed : boolean;
+  properties: Properties
 }
 
 export class VfModule extends NodeModel {
 
-  min:number;
-  max:number;
   vgName:string;
   rollbackOnFailure:boolean;
   initial:number;
   customizationUuid: string;
   modelCustomizationName: string;
+  volumeGroupAllowed : boolean;
 
   constructor(vf?: VFModuleResponseInterface) {
     super(vf);
     if(vf){
       this.customizationUuid = vf.customizationUuid;
       this.modelCustomizationName = vf.modelCustomizationName;
+      this.volumeGroupAllowed = vf.volumeGroupAllowed || false;
     }
     if (vf && vf.properties) {
       this.min = vf.properties.minCountInstances;
index c6db000..71140d4 100644 (file)
@@ -1,5 +1,14 @@
-export class VfModuleInstance {
-  instanceName: string;
+import {ChildNodeInstance} from "./nodeInstance";
+
+export class VfModuleInstance extends ChildNodeInstance{
   volumeGroupName: string;
   instanceParams: { [key: string] : string; };
+  isFailed: boolean;
+  position: any;
+  statusMessage?: string;
+
+  constructor() {
+    super();
+    this.instanceParams = {};
+  }
 }
index d4cc7e9..e3d1b79 100644 (file)
@@ -1,17 +1,23 @@
 import {VfModule} from "./vfModule";
 import {VfModuleInstance} from "./vfModuleInstance";
 import {ServiceNodeTypes} from "./ServiceNodeTypes";
+import {TreeLevel, TreeNodeModel} from "./treeNodeModel";
 
-export class VfModuleTreeNode {
-  modelId: string;
-  name: string;
-  modelName: string;
-  type: string;
+export class VfModuleTreeNode extends TreeNodeModel{
+  dynamicInputs: any;
+  dynamicModelName : string;
+  typeName: string;
+  menuActions: { [p: string]: { method: Function; visible: Function; enable: Function } };
+  isFailed: boolean;
+  statusMessage?: string;
 
-  constructor(vfModuleInstance: VfModuleInstance, vfModuleModel: VfModule, vfModuleModelName: string){
-    this.name = vfModuleInstance.instanceName || vfModuleInstance.volumeGroupName || '<Automatically Assigned>';
-    this.modelId = vfModuleModel.uuid;
+  constructor(vfModuleInstance: VfModuleInstance, vfModuleModel: VfModule, vfModuleModelName: string, dynamicInputs: any, isEcompGeneratedNaming: boolean, dynamicModelName : string){
+    super(vfModuleInstance,vfModuleModel);
+    this.name = vfModuleInstance.instanceName || vfModuleInstance.volumeGroupName || '&lt;Automatically Assigned&gt;';
     this.modelName = vfModuleModelName;
     this.type = ServiceNodeTypes.VFmodule;
+    this.isEcompGeneratedNaming = isEcompGeneratedNaming;
+    this.dynamicInputs = dynamicInputs;
+    this.dynamicModelName  = dynamicModelName;
   }
 }
diff --git a/vid-webpack-master/src/app/shared/models/vnfGroupInstance.ts b/vid-webpack-master/src/app/shared/models/vnfGroupInstance.ts
new file mode 100644 (file)
index 0000000..22ca444
--- /dev/null
@@ -0,0 +1,13 @@
+import {Level1Instance} from "./level1Instance";
+import {VnfMember} from "./VnfMember";
+import {NetworkInstance} from "./networkInstance";
+
+export class VnfGroupInstance extends Level1Instance{
+  vnfGroupStoreKey : string;
+  vnfs: { [vnf_module_model_name: string]: VnfMember; };
+  constructor() {
+    super();
+    this.vnfGroupStoreKey = null;
+    this.vnfs ={};
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/vnfGroupModel.ts b/vid-webpack-master/src/app/shared/models/vnfGroupModel.ts
new file mode 100644 (file)
index 0000000..5cff86c
--- /dev/null
@@ -0,0 +1,32 @@
+import {
+  Level1Model,
+  Level1ModelProperties,
+  Level1ModelResponseInterface
+} from "./nodeModel";
+import {ServiceProxyModel} from "./serviceProxyModel";
+
+
+export interface VnfGroupProperties extends Level1ModelProperties{
+  ecomp_generated_naming: string;
+  role?: string;
+  type?: string;
+  quantity?: number;
+}
+
+export interface VnfGroupModelResponseInterface extends Level1ModelResponseInterface{
+  properties: VnfGroupProperties;
+  members: {[key: string]: ServiceProxyModel};
+}
+
+export class VnfGroupModel extends Level1Model{
+  properties: VnfGroupProperties;
+  members: {[key: string]: ServiceProxyModel};
+
+    constructor(vnfGoupJson?: VnfGroupModelResponseInterface) {
+    super(vnfGoupJson);
+    if (vnfGoupJson) {
+      this.properties = vnfGoupJson.properties;
+      this.members = vnfGoupJson.members;
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/vnfGroupTreeNode.ts b/vid-webpack-master/src/app/shared/models/vnfGroupTreeNode.ts
new file mode 100644 (file)
index 0000000..0e71f47
--- /dev/null
@@ -0,0 +1,12 @@
+import {NetworkTreeNode} from "./networkTreeNode";
+import {NetworkInstance} from "./networkInstance";
+import {Level1Model} from "./nodeModel";
+
+export class VnfGroupTreeNode extends NetworkTreeNode{
+  vnfGroupStoreKey : string;
+  limitMembers: number;
+  constructor(instance: NetworkInstance, vnfGroupModel: Level1Model, vnfGroupStoreKey : string){
+    super(instance, vnfGroupModel, vnfGroupStoreKey);
+    this.vnfGroupStoreKey = vnfGroupStoreKey;
+  }
+}
index 7f41e48..8959cc5 100644 (file)
@@ -1,19 +1,18 @@
 import {VfModuleMap} from "./vfModulesMap";
+import {Level1Instance} from "./level1Instance";
+
+
+export class VnfInstance extends Level1Instance {
 
-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; };
+  vnfStoreKey : string;
+  isFailed: boolean;
+  position: number;
+  statusMessage?: string;
 
   constructor() {
-    this.rollbackOnFailure = 'true';
+    super();
     this.vfModules = {};
+    this.vnfStoreKey = null;
   }
 }
index e1302f1..8389606 100644 (file)
@@ -1,52 +1,27 @@
-import {NodeModel, NodeModelResponseInterface} from "./nodeModel";
-import {VfcInstanceGroupMap} from "./vfcInstanceGroupMap";
+import {
+  Level1Model,
+  Level1ModelProperties,
+  Level1ModelResponseInterface
+} from "./nodeModel";
 
 
-export interface VnfProperties {
-  ecomp_generated_naming: string
-}
 
-export interface VNFModelResponseInterface extends NodeModelResponseInterface{
+export interface VnfProperties extends Level1ModelProperties{
+  ecomp_generated_naming: string;
+}
 
-  serviceType: string;
-  serviceRole: string;
-  subCategory: string;
-  customizationUuid: string;
-  serviceEcompNaming: boolean;
-  type: string;
-  modelCustomizationName: string;
+export interface VNFModelResponseInterface extends Level1ModelResponseInterface{
   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;
+export class VNFModel extends Level1Model{
+  properties: VnfProperties;
 
-  constructor(vnfJson?: VNFModelResponseInterface){
+  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;
-
+      this.properties = vnfJson.properties;
     }
   }
 
-  private getIsUserProvidedName(vnfJson) {
-    const ecompGeneratedNaming = vnfJson.properties.ecomp_generated_naming;
-    return ecompGeneratedNaming !== undefined && ecompGeneratedNaming === "false";
-  };
 }
index 316bf3e..b878d01 100644 (file)
@@ -1,18 +1,17 @@
-import {VNFModel} from "./vnfModel";
-import {VnfInstance} from "./vnfInstance";
 import {VfModuleTreeNode} from "./vfModuleTreeNode";
+import {NetworkTreeNode} from "./networkTreeNode";
+import {Level1Model} from "./nodeModel";
+import {VnfInstance} from "./vnfInstance";
+import {ServiceNodeTypes} from "./ServiceNodeTypes";
+
+export class VnfTreeNode extends NetworkTreeNode{
 
-export class VnfTreeNode {
-  modelId: string;
-  name: string;
-  modelName: string;
-  type: string;
   children: VfModuleTreeNode[];
+  vnfStoreKey : string;
 
-  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;
+  constructor(instance: VnfInstance, vnfModel: Level1Model, vnfStoreKey : string){
+    super(<any>instance, vnfModel, vnfStoreKey);
+    this.type = ServiceNodeTypes.VF;
+    this.vnfStoreKey = vnfStoreKey;
   }
 }
index 84d2ff4..f0bcbb0 100644 (file)
@@ -1,25 +1,33 @@
-
 import {CapitalizeAndFormatPipe} from "./capitalize-and-format.pipe";
+import {TestBed} from "@angular/core/testing";
 
 describe('Capitalize And Format Pipe', () => {
   let capitalizeAndFormatPipe: CapitalizeAndFormatPipe;
 
-  beforeEach(() => {
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({});
+    await TestBed.compileComponents();
     capitalizeAndFormatPipe = new CapitalizeAndFormatPipe();
-  });
+  })().then(done).catch(done.fail));
+
 
-  it('Capitalize And Format Pipe should be defined', () => {
+  test('Capitalize And Format Pipe should be defined', () => {
     expect(capitalizeAndFormatPipe).toBeDefined();
   });
 
-  it('Capitalize And Format Pipe :  (UPPERCASE)', ()=> {
+  test('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 -', ()=> {
+  test('Capitalize And Format Pipe (UPPERCASE) and Underscore should replace by -', ()=> {
     let result: string = capitalizeAndFormatPipe.transform('IN_PROGRESS');
     expect(result).toEqual('In-progress');
   });
 
+  test('Capitalize And Format Pipe (COMPLETED_WITH_ERRORS) and All Underscores should replace by -', ()=> {
+    let result: string = capitalizeAndFormatPipe.transform('COMPLETED_WITH_ERRORS');
+    expect('Completed-with-errors').toEqual(result);
+  });
+
 });
index e3ec9ae..12b1eb9 100644 (file)
@@ -4,7 +4,7 @@ import {PipeTransform, Pipe} from '@angular/core';
 export class CapitalizeAndFormatPipe implements PipeTransform {
   transform(text: string): string {
     if (text) {
-      text = text.toLowerCase().replace('_', '-');
+      text = text.toLowerCase().replace(/_/g, '-');
       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
deleted file mode 100644 (file)
index 1ff8367..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * 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/dataFilter/data-filter.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.spec.ts
new file mode 100644 (file)
index 0000000..378ba25
--- /dev/null
@@ -0,0 +1,52 @@
+import {TestBed} from "@angular/core/testing";
+import {DataFilterPipe} from "./data-filter.pipe";
+
+describe('Data filter pipe', () => {
+
+  let dataFilterPipe: DataFilterPipe;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({});
+    await TestBed.compileComponents();
+
+    dataFilterPipe = new DataFilterPipe();
+
+  })().then(done).catch(done.fail));
+  const items= [{'id':1, 'name': 'aaa'},
+    {'id':12, 'name': 'bbb', 'children':{'first': 155, 'second': 2, 'third': 3}},
+    {'id':3, 'name': 'ccc', 'children':{'first': 1, 'second': 2, 'third': 3}},
+    {'id':4, 'name': 'aad', 'children':{'first': 1, 'second': 2, 'third': 3}}];
+  const keys : string[][] = [["id"],["name"],["children", "first"]];
+
+
+  test('should return items contains substring, keys not provided', () => {
+    const expected =  [{'id':1, 'name': 'aaa'}, {'id':4, 'name': 'aad', 'children':{'first': 1, 'second': 2, 'third': 3}}];
+    let res:any[] = dataFilterPipe.transform(items,'aa');
+    expect(res).toEqual(expected);
+  });
+
+
+  test('should return no result, keys not provided', () => {
+    const expected =  [];
+    let res:any[] = dataFilterPipe.transform(items,'5');
+    expect(res).toEqual(expected);
+  });
+
+  test('should return no result, deep keys provided', () => {
+    const expected =  [];
+    let res:any[] = dataFilterPipe.transform(items,'6', keys);
+    expect(res).toEqual(expected);
+  });
+
+  test('should return expected result, deep keys provided', () => {
+    const expected =  [{'id':12, 'name': 'bbb', 'children':{'first': 155, 'second': 2, 'third': 3}}];
+    let res:any[] = dataFilterPipe.transform(items,'155', keys);
+    expect(res).toEqual(expected);
+  });
+
+  test('should return expected result, case insensitive', () => {
+    const expected =  [{'id':12, 'name': 'bbb', 'children':{'first': 155, 'second': 2, 'third': 3}}];
+    let res:any[] = dataFilterPipe.transform(items,'BBB', keys);
+    expect(res).toEqual(expected);
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.ts b/vid-webpack-master/src/app/shared/pipes/dataFilter/data-filter.pipe.ts
new file mode 100644 (file)
index 0000000..4b4f1a5
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * Created by cp2122 on 1/4/2018.
+ */
+import { Pipe, PipeTransform } from '@angular/core';
+import * as _ from 'lodash';
+
+@Pipe({
+  name: 'dataFilter'
+})
+export class DataFilterPipe implements PipeTransform {
+
+  transform(items: any, searchStr: string, keys?: string[][]): any {
+    if (items != null && items.length > 0 && !_.isNil(searchStr)) {
+      let ans = [];
+
+      if (_.isNil(keys) || keys.length === 0) {
+        keys = Object.keys(items[0]).map((key)=> new Array(key) );
+      }
+      for (const item of items) {
+        for(const key of keys) {
+
+          let val: string = DataFilterPipe.getDeepObjectValueByKeys(item, key);
+          if (!_.isNil(val) && val.toLowerCase().includes(searchStr.toLowerCase())) {
+            ans.push(item);
+            break;
+          }
+        }
+      }
+      return ans;
+    }
+  }
+  /**********************************************************************
+   get value from obj data by array of keys.
+   @keys: all table column and keys
+   @rowData : row data
+   ************************************************************************/
+  static getDeepObjectValueByKeys(rowData: any , keys: string[]) : string {
+    let obj =  rowData[keys[0]];
+    if(_.isNil(obj)) {
+      return obj;
+    }
+    for(let i = 1; i < keys.length ; i++){
+      obj = obj[keys[i]];
+    }
+    return obj.toString();
+  }
+}
index 22b6192..9938a1c 100644 (file)
@@ -1,43 +1,47 @@
 import { DynamicInputLabelPipe } from './dynamic-input-label.pipe';
+import {TestBed} from "@angular/core/testing";
 
 describe('Dynamic input label Pipe', () => {
-  let dynamicInputLabelPipe: DynamicInputLabelPipe;
 
-  beforeEach(() => {
+  let dynamicInputLabelPipe: DynamicInputLabelPipe;
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({});
+    await TestBed.compileComponents();
     dynamicInputLabelPipe = new DynamicInputLabelPipe();
-  });
 
-  it('Dynamic input label Pipe should be defined', () => {
+  })().then(done).catch(done.fail));
+
+  test('Dynamic input label Pipe should be defined', () => {
     expect(dynamicInputLabelPipe).toBeDefined();
   });
 
-  it('Dynamic input label Pipe : Empty string should return empty string', ()=> {
+  test('Dynamic input label Pipe : Empty string should return empty string', ()=> {
       let result: string = dynamicInputLabelPipe.transform('');
-      expect(result).toEqual(':*');
+      expect(result).toEqual(':');
   });
 
-  it('Dynamic input label Pipe: vnf should be VNF (UPPERCASE)', ()=> {
+  test('Dynamic input label Pipe: vnf should be VNF (UPPERCASE)', ()=> {
     let result: string = dynamicInputLabelPipe.transform('vnf');
-    expect(result).toEqual('VNF:*');
+    expect(result).toEqual('VNF:');
   });
 
-  it('Dynamic input label Pipe : nf should be NF (UPPERCASE)\'', ()=> {
+  test('Dynamic input label Pipe : nf should be NF (UPPERCASE)\'', ()=> {
     let result: string = dynamicInputLabelPipe.transform('nf');
-    expect(result).toEqual('NF:*');
+    expect(result).toEqual('NF:');
   });
 
-  it('Dynamic input label Pipe : Underscore should replace by empty character', ()=> {
+  test('Dynamic input label Pipe : Underscore should replace by empty character', ()=> {
     let result: string = dynamicInputLabelPipe.transform('nf_Test');
-    expect(result).toEqual('NF test:*');
+    expect(result).toEqual('NF test:');
   });
 
-  it('Dynamic input label Pipe : Complex string', ()=> {
+  test('Dynamic input label Pipe : Complex string', ()=> {
     let result: string = dynamicInputLabelPipe.transform('nf_Test_vnf_nf');
-    expect(result).toEqual('NF test VNF NF:*');
+    expect(result).toEqual('NF test VNF NF:');
   });
 
-  it('Dynamic input label Pipe : First letter should be uppercase', ()=> {
+  test('Dynamic input label Pipe : First letter should be uppercase', ()=> {
     let result: string = dynamicInputLabelPipe.transform('nfr');
-    expect(result).toEqual('Nfr:*');
+    expect(result).toEqual('Nfr:');
   });
 });
index bec87b4..f0896be 100644 (file)
@@ -7,6 +7,6 @@ export class DynamicInputLabelPipe implements PipeTransform {
     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 + ':*';
+    return capitalize_sentence + ':';
   }
 }
diff --git a/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/highlight/highlight-filter.pipe.spec.ts
new file mode 100644 (file)
index 0000000..6c2fc42
--- /dev/null
@@ -0,0 +1,29 @@
+
+import {HighlightPipe} from "./highlight-filter.pipe";
+import {TestBed} from "@angular/core/testing";
+
+describe('Highlight Pipe', () => {
+  let highlightPipe: HighlightPipe;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({});
+    await TestBed.compileComponents();
+
+    highlightPipe = new HighlightPipe();
+
+  })().then(done).catch(done.fail));
+
+  test('Highlight Pipe should be defined', () => {
+    expect(highlightPipe).toBeDefined();
+  });
+
+  test('Highlight Pipe should return "HTML" with highlight class if match exist', () => {
+    let result : string = highlightPipe.transform('Hello World', 'Wor');
+    expect(result).toEqual('Hello <span class="highlight">Wor</span>ld');
+  });
+
+  test('Highlight Pipe should not return "HTML" with highlight class if no match exist', () => {
+    let result : string = highlightPipe.transform('Hello World', 'ABC');
+    expect(result).toEqual('Hello World');
+  });
+});
@@ -1,8 +1,10 @@
 import {PipeTransform, Pipe} from '@angular/core';
+import * as _ from 'lodash';
 
 @Pipe({ name: 'highlight' })
 export class HighlightPipe implements PipeTransform {
   transform(text: string, search: string): string {
+    if(_.isNil(text)) return text;
     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/objectToArray/objectToArray.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.spec.ts
new file mode 100644 (file)
index 0000000..093e173
--- /dev/null
@@ -0,0 +1,35 @@
+import {TestBed} from "@angular/core/testing";
+import {ObjectToArrayPipe} from "./objectToArray.pipe";
+
+
+describe('Object To Array Pipe', () => {
+  let pipe: ObjectToArrayPipe;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+
+    });
+    await TestBed.compileComponents();
+    pipe = new ObjectToArrayPipe();
+
+  })().then(done).catch(done.fail));
+
+
+  test('should flat object to array', () => {
+    let object = {
+      "a" : {
+        "name" :  "A"
+      },
+      "b" : {
+        "name" :  "B"
+      },
+      "c" : {
+        "name" :  "C"
+      }
+    };
+    let result = pipe.transform(object);
+    expect(result[0]).toEqual({"name" :  "A"});
+    expect(result[1]).toEqual({"name" :  "B"});
+    expect(result[2]).toEqual({"name" :  "C"});
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.ts b/vid-webpack-master/src/app/shared/pipes/objectToArray/objectToArray.pipe.ts
new file mode 100644 (file)
index 0000000..fa201d9
--- /dev/null
@@ -0,0 +1,8 @@
+import { PipeTransform, Pipe } from '@angular/core';
+import * as _ from 'lodash';
+@Pipe({name: 'objecttoarray'})
+export class ObjectToArrayPipe implements PipeTransform {
+  transform(obj) : any {
+    return _.values(obj);
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.spec.ts
new file mode 100644 (file)
index 0000000..e6a1d31
--- /dev/null
@@ -0,0 +1,60 @@
+import {OrderByPipe} from "./orderBy.pipe";
+import {TestBed} from "@angular/core/testing";
+
+
+describe('Sort Pipe', () => {
+  let pipe: OrderByPipe;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+
+    });
+    await TestBed.compileComponents();
+    pipe = new OrderByPipe();
+
+  })().then(done).catch(done.fail));
+
+
+  test('Sort should order the array with nested objects', () => {
+    let list = [
+      {
+        id: 1,
+        name: 'b'
+      },
+      {
+        id: 3,
+        name: 'a'
+      },
+      {
+        id: 2,
+        name: 'd'
+      }
+    ];
+
+    let result = pipe.transform(list, {property : 'name'});
+    expect(result.length).toEqual(3);
+    expect(result).toEqual(<any>[
+      {
+        'id': 3,
+        'name': 'a'
+      },
+      {
+        'id': 1,
+        'name': 'b'
+      },
+      {
+        'id': 2,
+        'name': 'd'
+      }])
+
+  });
+
+  test('Sort should order the array', () => {
+    let list = ['b', 'd', 'a'];
+
+    let result = pipe.transform(list);
+    expect(result.length).toEqual(3);
+    expect(result).toEqual(<any>['a', 'b', 'd']);
+
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.ts b/vid-webpack-master/src/app/shared/pipes/order/orderBy.pipe.ts
new file mode 100644 (file)
index 0000000..a3b8232
--- /dev/null
@@ -0,0 +1,35 @@
+import { Pipe, PipeTransform } from '@angular/core';
+import * as _ from 'lodash';
+@Pipe({  name: 'orderBy' })
+export class OrderByPipe implements PipeTransform {
+
+  transform(records: any[], args: any = {}): any {
+    args.direction =  !_.isNil(args.direction) ? args.direction : 1;
+
+    if(!_.isNil(records)){
+      return records.sort(function(a, b){
+        if(args.property){
+          if(a[args.property] < b[args.property]){
+            return -1 * args.direction;
+          }
+          else if( a[args.property] > b[args.property]){
+            return 1 * args.direction;
+          }
+          else{
+            return 0;
+          }
+        }else {
+          if(a < b){
+            return -1 * args.direction;
+          }
+          else if( a > b){
+            return 1 * args.direction;
+          }
+          else{
+            return 0;
+          }
+        }
+      });
+    }
+  };
+}
diff --git a/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.spec.ts
new file mode 100644 (file)
index 0000000..f047173
--- /dev/null
@@ -0,0 +1,60 @@
+import {SafePipe} from "./safe.pipe";
+import {DomSanitizer} from "@angular/platform-browser";
+import {getTestBed, TestBed} from "@angular/core/testing";
+
+
+describe('Safe pipe', () => {
+
+  let injector;
+  let pipe: SafePipe;
+  let sanitizer: DomSanitizer;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      providers: [SafePipe]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    sanitizer = injector.get(DomSanitizer);
+    pipe = injector.get(SafePipe);
+
+  })().then(done).catch(done.fail));
+
+  test('safe pipe should return Safe object', () => {
+    let options = [
+      {
+        value: 'value',
+        type: 'html',
+        func: 'bypassSecurityTrustHtml'
+      },
+      {
+        value: 'value',
+        type: 'style',
+        func: 'bypassSecurityTrustStyle'
+      },
+      {
+        value: 'value',
+        type: 'script',
+        func: 'bypassSecurityTrustScript'
+      },
+      {
+        value: 'value',
+        type: 'url',
+        func: 'bypassSecurityTrustUrl'
+      },
+      {
+        value: 'value',
+        type: 'resourceUrl',
+        func: 'bypassSecurityTrustResourceUrl'
+      }
+    ];
+
+    for (let option of options) {
+      jest.spyOn(sanitizer, <any>option.func);
+      pipe.transform(option.value, option.type);
+      expect(sanitizer[option.func]).toHaveBeenCalledWith(option.value);
+    }
+  });
+
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.ts b/vid-webpack-master/src/app/shared/pipes/safe/safe.pipe.ts
new file mode 100644 (file)
index 0000000..cff5b61
--- /dev/null
@@ -0,0 +1,22 @@
+// @ts-ignore
+import {DomSanitizer, SafeHtml, SafeResourceUrl, SafeScript, SafeStyle, SafeUrl} from "@angular/platform-browser";
+import {Pipe, PipeTransform} from "@angular/core";
+
+
+@Pipe({
+  name: 'safe'
+})
+export class SafePipe implements PipeTransform {
+
+  constructor(protected sanitizer: DomSanitizer) {}
+
+  public transform(value: any, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {
+    switch (type) {
+      case 'html': return this.sanitizer.bypassSecurityTrustHtml(value);
+      case 'style': return this.sanitizer.bypassSecurityTrustStyle(value);
+      case 'script': return this.sanitizer.bypassSecurityTrustScript(value);
+      case 'url': return this.sanitizer.bypassSecurityTrustUrl(value);
+      case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value);
+    }
+  }
+}
index 984e337..670f2f2 100644 (file)
@@ -1,14 +1,23 @@
 import {ServiceInfoPipe} from "./serviceInfo.pipe";
+import {TestBed} from "@angular/core/testing";
 
 
 describe('Service info Pipe', () => {
   let pipe: ServiceInfoPipe;
 
-  beforeEach(() => {
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+
+    });
+    await TestBed.compileComponents();
     pipe = new ServiceInfoPipe();
-  });
 
-  it('Service info Pipe should return model name', () => {
+
+  })().then(done).catch(done.fail));
+
+
+  test('Service info Pipe should return model name', () => {
     let store = {
       getState : function() {
         return {
@@ -24,7 +33,7 @@ describe('Service info Pipe', () => {
 
 
 
-  it('Service info Pipe should return null if  field name not exist', () => {
+  test('Service info Pipe should return null if  field name not exist', () => {
     let store = {
       getState : function() {
         return {
@@ -38,7 +47,7 @@ describe('Service info Pipe', () => {
     expect(result).toBeNull();
   });
 
-  it('Service info Pipe should return null if  model not exist', () => {
+  test('Service info Pipe should return null if  model not exist', () => {
     let store = {
       getState : function() {
         return {
@@ -53,6 +62,6 @@ describe('Service info Pipe', () => {
   });
 
   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":{}}}');
+    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":"Emanuel","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"10.0.0.10","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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":{}}}');
   }
 });
index 8cb2e1d..2876362 100644 (file)
@@ -1,11 +1,11 @@
 import {PipeTransform, Pipe} from '@angular/core';
-import {isNullOrUndefined} from "util";
+import * as _ from 'lodash';
 
 @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])){
+    if(!_.isNil(serviceHierarchy) && !_.isNil(serviceHierarchy[modelId])){
       return serviceHierarchy[modelId].service[fieldName] || null;
     }
     return null;
diff --git a/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.spec.ts b/vid-webpack-master/src/app/shared/resolvers/flag/flag.resolver.spec.ts
new file mode 100644 (file)
index 0000000..930562c
--- /dev/null
@@ -0,0 +1,61 @@
+import {TestBed, getTestBed} from '@angular/core/testing';
+import {
+  HttpClientTestingModule,
+  HttpTestingController
+} from '@angular/common/http/testing';
+import {NgRedux} from "@angular-redux/store";
+import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service";
+import {ActivatedRouteSnapshot, convertToParamMap} from "@angular/router";
+import {FlagsResolve} from "./flag.resolver";
+import {ConfigurationService} from "../../services/configuration.service";
+
+class MockAppStore<T> {
+  getState() {
+    return {
+      service: {
+        serviceInstance: {}
+      }
+    }
+  }
+}
+
+
+describe('Flag resolver', () => {
+  let injector;
+  let resolver: FlagsResolve;
+  let configurationService: ConfigurationService;
+  let httpMock: HttpTestingController;
+
+  let activatedRouteSnapshot: ActivatedRouteSnapshot;
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [
+        FlagsResolve,
+        ConfigurationService,
+        FeatureFlagsService,
+        {provide: NgRedux, useClass: MockAppStore},
+        {
+          provide: ActivatedRouteSnapshot, useValue: {
+            queryParamMap:
+              convertToParamMap({ })
+          }
+        },
+      ]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    resolver = injector.get(FlagsResolve);
+    httpMock = injector.get(HttpTestingController);
+    activatedRouteSnapshot = injector.get(ActivatedRouteSnapshot);
+    configurationService = injector.get(ConfigurationService);
+
+  })().then(done).catch(done.fail));
+
+  test('should update flags', () => {
+    spyOn(configurationService, 'getFlags');
+    resolver.resolve(activatedRouteSnapshot);
+    expect(configurationService.getFlags).toHaveBeenCalled();
+  });
+});
@@ -1,7 +1,7 @@
 import {ActivatedRouteSnapshot, Resolve} from "@angular/router";
 import {Injectable} from "@angular/core";
-import {ConfigurationService} from "./configuration.service";
-import {Observable} from "rxjs/Observable";
+import {Observable} from "rxjs";
+import {ConfigurationService} from "../../services/configuration.service";
 
 @Injectable()
 export class FlagsResolve implements Resolve<Observable< { [key: string]: boolean }>> {
diff --git a/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.spec.ts b/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.spec.ts
new file mode 100644 (file)
index 0000000..2578d7b
--- /dev/null
@@ -0,0 +1,306 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from "@angular-redux/store";
+import {ActivatedRouteSnapshot, convertToParamMap} from "@angular/router";
+import {AppState} from "../../store/reducers";
+import {RetryResolver} from "./retry.resolver";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service";
+import {Observable, of} from "rxjs";
+
+class MockAppStore<T> {
+  getState() {
+    return {
+      global:{
+        drawingBoardStatus: "VIEW"
+      },
+      service: {
+        serviceInstance: {}
+      }
+    }
+  }
+  dispatch(){
+
+  }
+}
+
+
+describe('View Edit resolver', () => {
+  let injector;
+  let aaiService: AaiService;
+  let resolver: RetryResolver;
+  let httpMock: HttpTestingController;
+  let store : NgRedux<AppState>;
+  let activatedRouteSnapshot: ActivatedRouteSnapshot;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [
+        FeatureFlagsService,
+        RetryResolver,
+        AaiService,
+        {provide: NgRedux, useClass: MockAppStore},
+        {
+          provide: ActivatedRouteSnapshot, useValue: {
+            queryParamMap:
+              convertToParamMap({
+                serviceModelId: 'serviceModelId',
+                subscriberId: 'subscriberId',
+                serviceType: 'serviceType',
+                serviceInstanceId : 'serviceInstanceId',
+                jobId : 'jobId'
+              })
+          },
+
+        }
+      ]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    aaiService = injector.get(AaiService);
+    resolver = injector.get(RetryResolver);
+    httpMock = injector.get(HttpTestingController);
+    activatedRouteSnapshot = injector.get(ActivatedRouteSnapshot);
+    store = injector.get(NgRedux)
+
+  })().then(done).catch(done.fail));
+
+
+  test("should call get all parameter's from url", () => {
+      expect(activatedRouteSnapshot.queryParamMap.get("serviceModelId")).toBe('serviceModelId');
+      expect(activatedRouteSnapshot.queryParamMap.get("subscriberId")).toBe('subscriberId');
+      expect(activatedRouteSnapshot.queryParamMap.get("serviceType")).toBe('serviceType');
+      expect(activatedRouteSnapshot.queryParamMap.get("serviceInstanceId")).toBe('serviceInstanceId');
+      expect(activatedRouteSnapshot.queryParamMap.get("jobId")).toBe('jobId');
+  });
+
+
+  test("should return retry topology", () => {
+      jest.spyOn(aaiService, 'getServiceModelById').mockReturnValue(of({}));
+      jest.spyOn(aaiService, 'retrieveAndStoreServiceInstanceTopology').mockReturnValue(of({
+        "vnfs": {
+          "2017-388_ADIOD-vPE 0": {
+            "vfModules": {},
+            "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+            "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "lineOfBusiness": "ONAP",
+            "platformName": "platform",
+            "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",
+              "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+            },
+            "instanceName": "2017388_ADIODvPEmCaNkinstanceName",
+            "legacyRegion": "some legacy region"
+          },
+          "2017-488_ADIOD-vPE 0": {
+            "vfModules": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+                  "instanceName": "VFinstancenameZERO",
+                  "modelInfo": {
+                    "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                    "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                    "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                    "modelVersion": "5",
+                    "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                    "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                    "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+                  },
+                  "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                  "provStatus": "Prov Status",
+                  "orchStatus": "Active",
+                  "inMaint": true
+                }
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+                  "instanceName": "VFinstancename",
+                  "volumeGroupName": "VFinstancename_vol_abc",
+                  "orchStatus": "Create",
+                  "provStatus": "Prov Status",
+                  "inMaint": false,
+                  "modelInfo": {
+                    "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                    "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                    "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                    "modelVersion": "6",
+                    "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                    "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                    "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                  },
+                  "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                }
+              }
+            },
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+            "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "lineOfBusiness": "ONAP",
+            "platformName": "platform",
+            "modelInfo": {
+              "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",
+              "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+            },
+            "orchStatus": "Created",
+            "inMaint": false,
+            "instanceName": "2017488_ADIODvPEVNFinstancename",
+            "legacyRegion": "some legacy region"
+          },
+          "2017-488_ADIOD-vPE 0:0001": {
+            "vfModules": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+                  "instanceName": "VFinstancenameZERO_001",
+                  "provStatus": "Prov Status",
+                  "inMaint": true,
+                  "modelInfo": {
+                    "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                    "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                    "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                    "modelVersion": "5",
+                    "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                    "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                    "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+                  },
+                  "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+                }
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+                  "instanceName": "VFinstancename_001",
+                  "volumeGroupName": "VFinstancename_vol_abc_001",
+                  "modelInfo": {
+                    "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                    "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                    "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                    "modelVersion": "6",
+                    "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                    "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                    "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                  },
+                  "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                }
+              }
+            },
+
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+            "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "lineOfBusiness": "ONAP",
+            "platformName": "platform",
+            "modelInfo": {
+              "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",
+              "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+            },
+            "instanceName": "2017488_ADIODvPEVNFinstancename_001",
+            "legacyRegion": "some legacy region"
+          },
+          "2017-488_ADIOD-vPE 0:0002": {
+            "vfModules": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+                  "instanceName": "VFinstancenameZERO_002",
+                  "modelInfo": {
+                    "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                    "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                    "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                    "modelVersion": "5",
+                    "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                    "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                    "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+                  },
+                  "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+                }
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+                  "instanceName": "VFinstancename_002",
+                  "volumeGroupName": "VFinstancename_vol_abc_002",
+                  "modelInfo": {
+                    "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                    "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                    "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                    "modelVersion": "6",
+                    "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                    "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                    "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                  },
+                  "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                }
+              }
+            },
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+            "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+            "lcpCloudRegionId": "JANET25",
+            "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+            "lineOfBusiness": "ONAP",
+            "platformName": "platform",
+            "modelInfo": {
+              "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",
+              "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+            },
+            "instanceName": "2017488_ADIODvPEVNFinstancename_002",
+            "legacyRegion": "some legacy region"
+          }
+        },
+        "vnfGroups": {},
+        "existingVnfGroupCounterMap": {},
+        "validationCounter": 0,
+        "existingVNFCounterMap": {
+          "afacccf6-397d-45d6-b5ae-94c39734b168": 1,
+          "69e09f68-8b63-4cc9-b9ff-860960b5db09": 3
+        },
+        "existingNetworksCounterMap": {},
+        "instanceName": "mCaNkinstancename",
+        "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "subscriptionServiceType": "TYLER SILVIA",
+        "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+        "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "lcpCloudRegionId": "hvf6",
+        "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+        "aicZoneId": "NFT1",
+        "projectName": "WATKINS",
+        "rollbackOnFailure": "true",
+        "aicZoneName": "NFTJSSSS-NFT1",
+        "owningEntityName": "WayneHolland",
+        "tenantName": "AIN Web Tool-15-D-testalexandria",
+        "modelInfo": {
+          "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+          "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+          "modelName": "action-data",
+          "modelVersion": "1.0",
+          "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+        },
+        "isALaCarte": false,
+        "orchStatus": "Active",
+        "modelInavariantId": "6b528779-44a3-4472-bdff-9cd15ec93450"
+      }));
+  });
+
+});
diff --git a/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.ts b/vid-webpack-master/src/app/shared/resolvers/retry/retry.resolver.ts
new file mode 100644 (file)
index 0000000..5e2250a
--- /dev/null
@@ -0,0 +1,27 @@
+import {ActivatedRouteSnapshot, Resolve} from "@angular/router";
+import {Injectable} from "@angular/core";
+import {Observable} from "rxjs";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {forkJoin} from "rxjs/observable/forkJoin";
+import {AppState} from "../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {createServiceInstance} from "../../storeUtil/utils/service/service.actions";
+
+@Injectable()
+export class RetryResolver implements Resolve<Observable<boolean>> {
+
+  constructor(private _aaiService: AaiService, private _store: NgRedux<AppState>) {}
+
+  resolve(route: ActivatedRouteSnapshot): Observable<boolean> {
+    const serviceModelId: string = route.queryParamMap.get("serviceModelId");
+    const jobId: string = route.queryParamMap.get("jobId");
+
+    let serviceModelApi = this._aaiService.getServiceModelById(serviceModelId);
+
+    let serviceInstanceApi = this._aaiService.retrieveAndStoreServiceInstanceRetryTopology(jobId, serviceModelId);
+    return forkJoin([serviceModelApi, serviceInstanceApi]).map(([serviceModel, serviceInstance ]) => {
+      this._store.dispatch(createServiceInstance( serviceInstance, serviceModelId));
+      return true;
+    });
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.spec.ts b/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.spec.ts
new file mode 100644 (file)
index 0000000..6e8fdc7
--- /dev/null
@@ -0,0 +1,82 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {NgRedux} from "@angular-redux/store";
+import {ViewEditResolver} from "./viewEdit.resolver";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {FeatureFlagsService} from "../../services/featureFlag/feature-flags.service";
+import {ActivatedRouteSnapshot, convertToParamMap} from "@angular/router";
+import {AppState} from "../../store/reducers";
+import {UpdateDrawingBoardStatusAction} from "../../storeUtil/utils/global/global.actions";
+
+class MockAppStore<T> {
+  getState() {
+    return {
+      global:{
+        drawingBoardStatus: "VIEW"
+      },
+      service: {
+        serviceInstance: {}
+      }
+    }
+  }
+  dispatch(){
+
+  }
+}
+
+
+describe('View Edit resolver', () => {
+  let injector;
+  let aaiService: AaiService;
+  let resolver: ViewEditResolver;
+  let httpMock: HttpTestingController;
+  let store : NgRedux<AppState>;
+
+  let activatedRouteSnapshot: ActivatedRouteSnapshot;
+  let updateDrawingBoardStatusAction: UpdateDrawingBoardStatusAction;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [
+        ViewEditResolver,
+        AaiService,
+        FeatureFlagsService,
+        {provide: NgRedux, useClass: MockAppStore},
+        {
+          provide: ActivatedRouteSnapshot, useValue: {
+            queryParamMap:
+              convertToParamMap({
+                serviceModelId: 'serviceModelId',
+                subscriberId: 'subscriberId',
+                serviceType: 'serviceType',
+                serviceInstanceId : 'serviceInstanceId'
+              })
+          },
+
+        }
+      ]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    aaiService = injector.get(AaiService);
+    resolver = injector.get(ViewEditResolver);
+    httpMock = injector.get(HttpTestingController);
+    activatedRouteSnapshot = injector.get(ActivatedRouteSnapshot);
+    store = injector.get(NgRedux)
+
+  })().then(done).catch(done.fail));
+
+
+  test('should call both api', () => {
+    // spyOn(aaiService, 'getServiceModelById');
+    // spyOn(aaiService, 'retrieveAndStoreServiceInstanceTopology');
+    // spyOn(store, 'dispatch');
+    // resolver.resolve(activatedRouteSnapshot);
+    //
+    // expect(aaiService.getServiceModelById).toHaveBeenCalledWith('serviceModelId');
+    // expect(aaiService.retrieveAndStoreServiceInstanceTopology).toHaveBeenCalledWith('serviceInstanceId', 'subscriberId', 'serviceType', 'serviceModelId');
+  });
+
+});
diff --git a/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.ts b/vid-webpack-master/src/app/shared/resolvers/viewEdit/viewEdit.resolver.ts
new file mode 100644 (file)
index 0000000..d4aef19
--- /dev/null
@@ -0,0 +1,40 @@
+import {ActivatedRouteSnapshot, Resolve} from "@angular/router";
+import {Injectable} from "@angular/core";
+import {Observable} from "rxjs";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {forkJoin} from "rxjs/observable/forkJoin";
+import {AppState} from "../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {createServiceInstance} from "../../storeUtil/utils/service/service.actions";
+
+@Injectable()
+export class ViewEditResolver implements Resolve<Observable<boolean>> {
+
+  constructor(private _aaiService: AaiService, private _store: NgRedux<AppState>) {
+  }
+
+  resolve(route: ActivatedRouteSnapshot): Observable<boolean> {
+    const serviceModeId: string = route.queryParamMap.get("serviceModelId");
+    const serviceInstanceId: string = route.queryParamMap.get("serviceInstanceId");
+    const subscriberId: string = route.queryParamMap.get("subscriberId");
+    const serviceType: string = route.queryParamMap.get("serviceType");
+      let serviceModelApi = this._aaiService.getServiceModelById(serviceModeId);
+      let serviceInstanceApi = this._aaiService.retrieveAndStoreServiceInstanceTopology(serviceInstanceId, subscriberId, serviceType, serviceModeId);
+      return forkJoin([serviceModelApi, serviceInstanceApi]).map(([serviceModel, serviceInstance ]) => {
+        this.setIsALaCarte(serviceInstance,serviceModel.service.instantiationType );
+        this.setTestApi(serviceInstance);
+        this._store.dispatch(createServiceInstance( serviceInstance, serviceModeId));
+          return true;
+        });
+  }
+
+  setTestApi = (service: any) => {
+    if (this._store.getState().global.flags['FLAG_ADD_MSO_TESTAPI_FIELD'] && service.isALaCarte) {
+      service.testApi = sessionStorage.getItem("msoRequestParametersTestApiValue");
+    }
+  };
+  setIsALaCarte = (service: any, instantiationType) => {
+    service.isALaCarte = instantiationType === 'A-La-Carte';
+  };
+
+}
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
deleted file mode 100644 (file)
index 36f6349..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-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
-          }
-        },
-      ]);
-    });
-
-  });
-
-});
index 4305ab9..71e32f1 100644 (file)
@@ -1,6 +1,6 @@
 import { Injectable } from '@angular/core';
 import {HttpClient} from "@angular/common/http";
-import {Observable} from "rxjs/Observable";
+import {Observable} from "rxjs";
 import {Constants} from "../../utils/constants";
 import {ExternalComponentStatus} from "../../models/externalComponentStatus";
 
@@ -10,8 +10,8 @@ export class HealthStatusService {
   constructor(private _http: HttpClient) {
   }
 
-  getProbe(): Observable<Array<ExternalComponentStatus>> {
+  getProbe(): Observable<ExternalComponentStatus[]> {
     let pathQuery = Constants.Path.SERVICES_PROBE_PATH;
-    return this._http.get<Array<ExternalComponentStatus>>(pathQuery).map(res => res);
+    return this._http.get<ExternalComponentStatus[]>(pathQuery).map(res => res);
   }
 }
index 0b4c70f..a0920a9 100644 (file)
@@ -6,5 +6,7 @@ export class AuditStatus{
   jobStatus :string;
   source: string;
   requestId: string;
-  additionalInfo :any
+  additionalInfo :any;
+  instanceName: string;
+  instanceType : string;
 }
index 0b46959..a507e07 100644 (file)
@@ -1,4 +1,5 @@
 import {ServiceStatus} from '../../../instantiationStatus/instantiationStatus.component.service';
+import {ServiceAction} from "../../models/serviceInstanceActions";
 
 export class ServiceInfoModel {
   id: number;
@@ -9,6 +10,8 @@ export class ServiceInfoModel {
   numRow: number;
   uuid: string;
   userId: string;
+  requestId: string;
+  aLaCarte: boolean;
   jobStatus: string;
   pause: boolean;
   owningEntityId: string;
@@ -22,6 +25,7 @@ export class ServiceInfoModel {
   regionName: string;
   serviceType: string;
   subscriberName: string;
+  subscriberId: string;
   serviceInstanceId: string;
   serviceInstanceName: string;
   serviceModelId: string;
@@ -30,6 +34,8 @@ export class ServiceInfoModel {
   templateId: string;
   auditUserId: string;
   jobId: string;
+  action: ServiceAction;
+  isRetryEnabled: boolean;
 }
 
 export class ServiceInfoUiModel extends ServiceInfoModel{
index 78c1b5a..147434b 100644 (file)
@@ -9,59 +9,75 @@ describe('Service Info Service', () => {
   let service: ServiceInfoService;
   let httpMock: HttpTestingController;
 
-  beforeEach(() => {
+  beforeAll(done => (async () => {
     TestBed.configureTestingModule({
       imports: [HttpClientTestingModule],
       providers: [ServiceInfoService]
     });
+    await TestBed.compileComponents();
+
 
     injector = getTestBed();
     service = injector.get(ServiceInfoService);
     httpMock = injector.get(HttpTestingController);
-  });
 
-  describe('#getServicesJobInfo', () => {
-    it('should return an Observable<ServiceInfoModel[]>', () => {
-      const dummyServiceInfo: ServiceInfoModel[] = generateServiceInfoData();
+  })().then(done).catch(done.fail));
 
-      service.getServicesJobInfo(true).subscribe((serviceInfo:Array<ServiceInfoModel>) => {
-        expect(serviceInfo).toEqual(dummyServiceInfo);
-      });
-    });
+  describe('#getMacroJobAuditStatus', ()=> {
+    test('should return Observable<Object[]>', ()=>{
+      let job: ServiceInfoModel = new ServiceInfoModel();
+      job.jobId = '111';
 
+      service.getJobAuditStatus(job).subscribe();
+      const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID');
+      const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=MSO');
 
+      expect(req.request.method).toBe('GET');
+      expect(req2.request.method).toBe('GET');
+    });
   });
 
-  describe('#deleteJob', () =>{
-    it('delete job', () => {
-      const jobId : string = "1111";
-
-      service.deleteJob(jobId).subscribe();
+  describe('#getALaCarteJobAuditStatus Without params', ()=> {
+    test('should return Observable<Object[]>', ()=>{
+      let job: ServiceInfoModel = new ServiceInfoModel();
+      job.aLaCarte = true;
+      job.jobId = '111';
 
-      const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + '/job/' + jobId);
-      expect(req.request.method).toEqual('DELETE');
+      service.getJobAuditStatus(job).subscribe();
+      const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID');
+      const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '/mso');
 
+      expect(req.request.method).toEqual('GET');
+      expect(req2.request.method).toEqual('GET');
     });
   });
 
-  describe('#hideJob', () =>{
-    it('when call hide job, there is http POST with right url', () => {
-      const jobId : string = "3";
+  describe('#getALaCarteJobAuditStatus With ServiceInstanceId', ()=> {
+    test('should return Observable<Object[]>', ()=>{
+      let job: ServiceInfoModel = new ServiceInfoModel();
+      job.aLaCarte = true;
+      job.jobId = '111';
+      job.serviceInstanceId = '222';
 
-      service.hideJob(jobId).subscribe();
+      service.getJobAuditStatus(job).subscribe();
+      const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID');
+      const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '/mso?serviceInstanceId=' + job.serviceInstanceId);
 
-      const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + '/hide/' + jobId);
-      expect(req.request.method).toEqual('POST');
+      expect(req.request.method).toEqual('GET');
+      expect(req2.request.method).toEqual('GET');
     });
   });
 
-  describe('#getJobAuditStatus', ()=> {
-    it('should return Observable<Object[]>', ()=>{
-      const jobId : string = '111';
+  describe('#getALaCarteJobAuditStatus With RequestId', ()=> {
+    test('should return Observable<Object[]>', ()=>{
+      let job: ServiceInfoModel = new ServiceInfoModel();
+      job.aLaCarte = true;
+      job.jobId = '111';
+      job.requestId = '333';
 
-      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');
+      service.getJobAuditStatus(job).subscribe();
+      const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '?source=VID');
+      const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + job.jobId + '/mso?requestId=' + job.requestId);
 
       expect(req.request.method).toEqual('GET');
       expect(req2.request.method).toEqual('GET');
@@ -73,6 +89,7 @@ describe('Service Info Service', () => {
       [{
         "created": 1519956533000,
         "modified": 1521727738000,
+        "action": "INSTANTIATE",
         "createdId": null,
         "modifiedId": null,
         "rowNum": null,
@@ -105,6 +122,7 @@ describe('Service Info Service', () => {
       {
         "created": 1519956533000,
         "modified": 1521727738000,
+        "action": "INSTANTIATE",
         "createdId": null,
         "modifiedId": null,
         "rowNum": null,
@@ -137,6 +155,7 @@ describe('Service Info Service', () => {
       {
         "created": 1519956533000,
         "modified": 1521727738000,
+        "action": "INSTANTIATE",
         "createdId": null,
         "modifiedId": null,
         "rowNum": null,
@@ -169,6 +188,7 @@ describe('Service Info Service', () => {
       {
         "created": 1519956533000,
         "modified": 1521727738000,
+        "action": "INSTANTIATE",
         "createdId": null,
         "modifiedId": null,
         "rowNum": null,
@@ -201,6 +221,7 @@ describe('Service Info Service', () => {
       {
         "created": 1519956533000,
         "modified": 1521727738000,
+        "action": "INSTANTIATE",
         "createdId": null,
         "modifiedId": null,
         "rowNum": null,
index e0057bb..fe6ebc7 100644 (file)
@@ -1,19 +1,23 @@
 import {Injectable} from '@angular/core';
-import {Observable} from 'rxjs/Observable';
+import {Observable} from 'rxjs';
 import {ServiceInfoModel} from './serviceInfo.model';
-import {HttpClient} from '@angular/common/http';
-import 'rxjs/add/operator/map'
+import {HttpClient, HttpHeaders} from '@angular/common/http';
+import { of } from 'rxjs';
+import { map } from 'rxjs/operators';
 import {Constants} from '../../utils/constants';
 import {forkJoin} from "rxjs/observable/forkJoin";
+import * as _ from 'lodash';
+import {AuditStatus} from "./AuditStatus.model";
 
 @Injectable()
 export class ServiceInfoService {
   constructor(private _http: HttpClient) {
   }
 
-  getServicesJobInfo(filterByUser : boolean): Observable<ServiceInfoModel[]> {
+  getServicesJobInfo(filterByUser : boolean, showSpinner: boolean = true): Observable<ServiceInfoModel[]> {
     let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH;
-    return this._http.get<ServiceInfoModel[]>(pathQuery).map(res => res );
+    let headers = new HttpHeaders({'x-show-spinner': showSpinner.toString()});
+    return this._http.get<ServiceInfoModel[]>(pathQuery, { headers: headers }).map(res => res );
   }
 
   deleteJob(jobId: string): Observable<any> {
@@ -26,13 +30,42 @@ export class ServiceInfoService {
     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';
+  getJobAuditStatus(jobData: ServiceInfoModel) : Observable<Object[]>{
+    let pathQueryBySource: string = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobData.jobId + '?source=';
+    let pathQueryVID: string = pathQueryBySource + 'VID';
+    let pathQueryMSO: string;
+
+    // just call it
+    if(jobData.aLaCarte) {
+      let requestParams: string[] = [];
+      pathQueryMSO = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobData.jobId + '/mso';
+      if (!_.isEmpty(jobData.requestId)) {
+        requestParams[requestParams.length] = 'requestId=' + jobData.requestId;
+      }
+      if (!_.isEmpty(jobData.serviceInstanceId)) {
+        requestParams[requestParams.length] = 'serviceInstanceId=' + jobData.serviceInstanceId;
+      }
+      if (requestParams.length > 0) {
+        pathQueryMSO += '?' + requestParams.join('&');
+      }
+    }
+    else {
+      pathQueryMSO = pathQueryBySource + 'MSO';
+    }
+
 
     let vidObs = this._http.get(pathQueryVID);
     let msoObs = this._http.get(pathQueryMSO);
     return forkJoin([vidObs, msoObs]);
   }
 
+  getInstanceAuditStatus(instanceId: string, type :string) : Observable<AuditStatus[]>{
+    let pathQuery: string =  Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + type + '/' + instanceId + '/mso';
+    return this._http.get<any>(pathQuery).map(res => res);
+  }
+
+  getAuditStatusForRetry(trackById: string) : Observable<AuditStatus>{
+    let pathQuery: string = Constants.Path.AUDIT_STATUS_FOR_RETRY_PATH + '/' + trackById ;
+    return this._http.get<any>(pathQuery).map(res => res);
+  }
 }
@@ -50,8 +50,10 @@ export const loadUserId: ActionCreator<LoadUserId> =
 
 
   export const loadLcpTenant: ActionCreator<LoadLcpTenant> =
-  () => ({
+  (subscriberId : string, serviceType : string) => ({
     type: LOAD_LCP_TENANT,
+    subscriberId : subscriberId,
+    serviceType : serviceType
   });
 
 
@@ -1,6 +1,5 @@
-import {updateServiceInstance} from './../../service.actions';
 import {Injectable} from '@angular/core';
-import {createEpicMiddleware} from 'redux-observable';
+import {combineEpics, createEpicMiddleware, ofType} from 'redux-observable';
 import 'rxjs/add/operator/catch';
 import 'rxjs/add/operator/map';
 import 'rxjs/add/operator/do';
@@ -15,11 +14,15 @@ import {
   LOAD_USER_ID
 } from "./aai.actions";
 import {AaiService} from "./aai.service";
+import {AppState} from "../../store/reducers";
 import {
-  updateAicZones, updateCategoryParameters, updateLcpRegionsAndTenants, updateNetworkCollectionFunction,
+  updateAicZones, updateCategoryParameters,
+  updateLcpRegionsAndTenants,
+  updateNetworkCollectionFunction,
   updateProductFamilies, updateUserId
-} from "../../service.actions";
-import {AppState} from "../../store/reducers";
+} from "../../storeUtil/utils/general/general.actions";
+import {createServiceInstance} from "../../storeUtil/utils/service/service.actions";
+import {delay, mapTo} from "rxjs/operators";
 
 const notFetchedAlready = (state: AppState): boolean => state.service.productFamilies !== null;
 
@@ -29,23 +32,20 @@ export class AAIEpics {
   }
 
   public createEpic() {
-    return [createEpicMiddleware(this.loadProductFamiliesEpic)
-      , createEpicMiddleware(this.loadLcpTenants)
-      , createEpicMiddleware(this.loadAicZones)
-      , createEpicMiddleware(this.loadCategoryParameters)
-      , createEpicMiddleware(this.loadServiceAccordingToUuid)
-      , createEpicMiddleware(this.loadNetworkAccordingToNetworkFunction)
-      , createEpicMiddleware(this.loadUserId)
-    ];
+    return combineEpics(
+        this.loadProductFamiliesEpic
+      , this.loadLcpTenants
+      , this.loadAicZones
+      , this.loadCategoryParameters
+      , this.loadServiceAccordingToUuid
+      , this.loadNetworkAccordingToNetworkFunction
+      , 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)));
+   action$.ofType(LOAD_LCP_TENANT)
+    .switchMap((action) => this.aaiService.getLcpRegionsAndTenants(action.subscriberId, action.serviceType)
+    .map(data => updateLcpRegionsAndTenants(data)));
 
   private loadProductFamiliesEpic = (action$, store) => action$
     .ofType(LOAD_PRODUCT_FAMILIES)
@@ -64,7 +64,7 @@ export class AAIEpics {
   private loadServiceAccordingToUuid = (action$, store) => action$
     .ofType(LOAD_SERVICE_MDOEL_BY_UUID)
     .switchMap((action) => this.aaiService.getServiceModelById(action.modelId)
-      .map(data => updateServiceInstance(action.uuid, data)));
+      .map(data => createServiceInstance(action.uuid, data)));
 
   private loadUserId = (action$, store) => action$
     .ofType(LOAD_USER_ID)
diff --git a/vid-webpack-master/src/app/shared/services/aaiService/aai.service.spec.ts b/vid-webpack-master/src/app/shared/services/aaiService/aai.service.spec.ts
new file mode 100644 (file)
index 0000000..9f19f62
--- /dev/null
@@ -0,0 +1,497 @@
+import {ServiceInstance} from "../../models/serviceInstance";
+import {RootObject} from "./model/crawledAaiService";
+import {AaiService} from "./aai.service";
+import {instance, mock, when} from "ts-mockito";
+import {FeatureFlagsService, Features} from "../featureFlag/feature-flags.service";
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {NgRedux} from "@angular-redux/store";
+import {Constants} from "../../utils/constants";
+import {AppState} from "../../store/reducers";
+import {setOptionalMembersVnfGroupInstance} from "../../storeUtil/utils/vnfGroup/vnfGroup.actions";
+import each from 'jest-each';
+
+class MockAppStore<T> {
+  dispatch(){}
+  getState(){}
+}
+
+describe("AaiService", () => {
+
+  let injector;
+  let httpMock: HttpTestingController;
+  let aaiService: AaiService;
+  let mockFeatureFlagsService: FeatureFlagsService = mock(FeatureFlagsService);
+  let store : NgRedux<AppState>;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [
+        AaiService,
+        {provide: NgRedux, useClass: MockAppStore},
+        {provide: FeatureFlagsService, useValue: instance(mockFeatureFlagsService)}
+      ]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    httpMock = injector.get(HttpTestingController);
+    aaiService = injector.get(AaiService);
+    store = injector.get(NgRedux);
+
+  })().then(done).catch(done.fail));
+
+
+
+  describe('#resolve tests', () => {
+    test('aai service resolve should return the right object', () => {
+      let serviceInstance = new ServiceInstance();
+      aaiService.resolve(aaiServiceInstnace.root, serviceInstance);
+
+      expectedResult.vnfs['DROR_vsp'].trackById = serviceInstance.vnfs['DROR_vsp'].trackById;
+      expect(JSON.parse(JSON.stringify(serviceInstance.vnfs))).toEqual(expectedResult.vnfs);
+      expect(JSON.parse(JSON.stringify(serviceInstance.networks))).toEqual(expectedResult.networks);
+    });
+  });
+
+  describe('#serviceInstanceTopology tests', () => {
+    test('aai service get serviceInstanceTopolgetServiceInstanceTopologyResult.jsonogy from backend, and return ServiceInstance', () => {
+
+      const mockedResult = getTopology();
+      const serviceInstanceId: string = "id";
+      const subscriberId: string = "fakeSunId";
+      const serviceType: string = "justServiceType";
+      aaiService.retrieveServiceInstanceTopology(serviceInstanceId, subscriberId, serviceType).subscribe((result: ServiceInstance) => {
+        expect(result.instanceName).toEqual("mCaNkinstancename");
+        expect(result.modelInavariantId).toEqual("6b528779-44a3-4472-bdff-9cd15ec93450");
+        expect(result.vnfs["2017-388_ADIOD-vPE 0"].instanceName).toEqual("2017388_ADIODvPEmCaNkinstanceName");
+        expect(result.vnfs["2017-488_ADIOD-vPE 0"].
+          vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"]
+          ["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].instanceName
+        ).toEqual("VFinstancenameZERO");
+      });
+
+      const req = httpMock.expectOne(`${Constants.Path.AAI_GET_SERVICE_INSTANCE_TOPOLOGY_PATH}${subscriberId}/${serviceType}/${serviceInstanceId}`);
+      expect(req.request.method).toEqual('GET');
+      req.flush(mockedResult);
+    });
+  });
+
+
+  describe('#retrieveAndStoreServiceInstanceRetryTopology tests', () => {
+    test('aai service get retrieveAndStoreServiceInstanceRetryTopology.jsonogy from backend, and return ServiceInstance', () => {
+
+      let mockedResult = getTopology();
+
+      const jobId: string = "jobId";
+      aaiService.retrieveServiceInstanceRetryTopology(jobId).subscribe((result: ServiceInstance) => {
+        expect(result.instanceName).toEqual("mCaNkinstancename");
+        expect(result.modelInavariantId).toEqual("6b528779-44a3-4472-bdff-9cd15ec93450");
+        expect(result.vnfs["2017-388_ADIOD-vPE 0"].instanceName).toEqual("2017388_ADIODvPEmCaNkinstanceName");
+        expect(result.vnfs["2017-488_ADIOD-vPE 0"].
+          vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0"]
+          ["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot"].instanceName
+        ).toEqual("VFinstancenameZERO");
+      });
+
+      const req = httpMock.expectOne(`${Constants.Path.SERVICES_RETRY_TOPOLOGY}/${jobId}`);
+      expect(req.request.method).toEqual('GET');
+      req.flush(mockedResult);
+    });
+  });
+
+  describe('# get optional group members tests', () =>{
+    test('aai service get getOptionalGroupMembers and return list of VnfMember', () => {
+      jest.spyOn(store, 'dispatch');
+      jest.spyOn(store, 'getState').mockReturnValue({
+        service :{
+          serviceInstance : {
+            "serviceModelId" : {
+              optionalGroupMembersMap : {}
+            }
+          }
+        }
+      });
+      const mockedResult = getMockMembers();
+      const serviceInvariantId: string = "serviceInvariantId";
+      const subscriberId: string = "subscriberId";
+      const serviceType: string = "serviceType";
+      const groupType: string = "groupType";
+      const groupRole: string = "groupRole";
+      const serviceModelId: string = "serviceModelId";
+       aaiService.getOptionalGroupMembers(serviceModelId, subscriberId, serviceType, serviceInvariantId, groupType, groupRole).subscribe((res)=>{
+         const path = `${Constants.Path.AAI_GET_SERVICE_GROUP_MEMBERS_PATH}${subscriberId}/${serviceType}/${serviceInvariantId}/${groupType}/${groupRole}`;
+         expect(store.dispatch).toHaveBeenCalledWith(setOptionalMembersVnfGroupInstance(serviceModelId, path, res));
+         expect(res.length).toEqual(2);
+        });
+
+
+      const req = httpMock.expectOne(`${Constants.Path.AAI_GET_SERVICE_GROUP_MEMBERS_PATH}${subscriberId}/${serviceType}/${serviceInvariantId}/${groupType}/${groupRole}`);
+      expect(req.request.method).toEqual('GET');
+      req.flush(mockedResult);
+    });
+  });
+  describe('#cloud owner tests', () => {
+    let featureFlagToLcpRegionName = [
+      ['aai service extract lcpRegion, flag is true=> lcp region include cloud owner', true, 'id (OWNER)' ],
+      ['aai service extract lcpRegion, flag is false=> lcp region doesnt include cloud owner', false, 'id']
+    ];
+
+    each(featureFlagToLcpRegionName).test("%s", (desc: string, flag: boolean, expectedName: string ) => {
+        when(mockFeatureFlagsService.getFlagState(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(flag);
+        let name: string = aaiService.extractLcpRegionName("id", "att-owner");
+        expect(name).toEqual(expectedName);
+    });
+
+    let cloudOwnerFormattingDataProvider = [
+      ['classic cloud owner', 'irma-aic', ' (AIC)'],
+      ['upper case cloud owner', 'IRMA-AIC', ' (AIC)'],
+      ['no att cloud owner', 'nc', ' (NC)'],
+    ];
+
+    each(cloudOwnerFormattingDataProvider).test('test cloudOwner trailer formatting %s', (desc: string, cloudOwner: string, expectedTrailer: string) => {
+      expect(AaiService.formatCloudOwnerTrailer(cloudOwner)).toEqual(expectedTrailer);
+    });
+  });
+
+  function getTopology() {
+    return  {
+      "vnfs": {
+        "2017-388_ADIOD-vPE 0": {
+          "vfModules": {},
+          "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+          "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "lcpCloudRegionId": "JANET25",
+          "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+          "lineOfBusiness": "ONAP",
+          "platformName": "platform",
+          "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",
+            "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168"
+          },
+          "instanceName": "2017388_ADIODvPEmCaNkinstanceName",
+          "legacyRegion": "some legacy region"
+        },
+        "2017-488_ADIOD-vPE 0": {
+          "vfModules": {
+            "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+                "instanceName": "VFinstancenameZERO",
+                "modelInfo": {
+                  "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                  "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                  "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                  "modelVersion": "5",
+                  "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                  "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                  "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+                },
+                "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                "provStatus": "Prov Status",
+                "orchStatus": "Active",
+                "inMaint": true
+              }
+            },
+            "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+                "instanceName": "VFinstancename",
+                "volumeGroupName": "VFinstancename_vol_abc",
+                "orchStatus": "Create",
+                "provStatus": "Prov Status",
+                "inMaint": false,
+                "modelInfo": {
+                  "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                  "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                  "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                  "modelVersion": "6",
+                  "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                  "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                  "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                },
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+              }
+            }
+          },
+          "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+          "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "lcpCloudRegionId": "JANET25",
+          "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+          "lineOfBusiness": "ONAP",
+          "platformName": "platform",
+          "modelInfo": {
+            "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",
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+          },
+          "orchStatus": "Created",
+          "inMaint": false,
+          "instanceName": "2017488_ADIODvPEVNFinstancename",
+          "legacyRegion": "some legacy region"
+        },
+        "2017-488_ADIOD-vPE 0:0001": {
+          "vfModules": {
+            "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+                "instanceName": "VFinstancenameZERO_001",
+                "provStatus": "Prov Status",
+                "inMaint": true,
+                "modelInfo": {
+                  "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                  "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                  "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                  "modelVersion": "5",
+                  "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                  "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                  "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+                },
+                "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+              }
+            },
+            "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+                "instanceName": "VFinstancename_001",
+                "volumeGroupName": "VFinstancename_vol_abc_001",
+                "modelInfo": {
+                  "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                  "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                  "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                  "modelVersion": "6",
+                  "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                  "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                  "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                },
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+              }
+            }
+          },
+
+          "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+          "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "lcpCloudRegionId": "JANET25",
+          "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+          "lineOfBusiness": "ONAP",
+          "platformName": "platform",
+          "modelInfo": {
+            "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",
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+          },
+          "instanceName": "2017488_ADIODvPEVNFinstancename_001",
+          "legacyRegion": "some legacy region"
+        },
+        "2017-488_ADIOD-vPE 0:0002": {
+          "vfModules": {
+            "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0uvfot": {
+                "instanceName": "VFinstancenameZERO_002",
+                "modelInfo": {
+                  "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                  "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                  "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                  "modelVersion": "5",
+                  "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                  "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                  "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+                },
+                "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db"
+              }
+            },
+            "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1fshmc": {
+                "instanceName": "VFinstancename_002",
+                "volumeGroupName": "VFinstancename_vol_abc_002",
+                "modelInfo": {
+                  "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                  "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                  "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                  "modelVersion": "6",
+                  "modelCustomizationId": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                  "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                  "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+                },
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5"
+              }
+            }
+          },
+          "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+          "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "lcpCloudRegionId": "JANET25",
+          "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+          "lineOfBusiness": "ONAP",
+          "platformName": "platform",
+          "modelInfo": {
+            "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",
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09"
+          },
+          "instanceName": "2017488_ADIODvPEVNFinstancename_002",
+          "legacyRegion": "some legacy region"
+        }
+      },
+      "vnfGroups": {},
+      "existingVnfGroupCounterMap": {},
+      "validationCounter": 0,
+      "existingVNFCounterMap": {
+        "afacccf6-397d-45d6-b5ae-94c39734b168": 1,
+        "69e09f68-8b63-4cc9-b9ff-860960b5db09": 3
+      },
+      "existingNetworksCounterMap": {},
+      "instanceName": "mCaNkinstancename",
+      "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+      "subscriptionServiceType": "TYLER SILVIA",
+      "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+      "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+      "lcpCloudRegionId": "hvf6",
+      "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+      "aicZoneId": "NFT1",
+      "projectName": "WATKINS",
+      "rollbackOnFailure": "true",
+      "aicZoneName": "NFTJSSSS-NFT1",
+      "owningEntityName": "WayneHolland",
+      "tenantName": "AIN Web Tool-15-D-testalexandria",
+      "modelInfo": {
+        "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+        "modelName": "action-data",
+        "modelVersion": "1.0",
+        "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450"
+      },
+      "isALaCarte": false,
+      "orchStatus": "Active",
+      "modelInavariantId": "6b528779-44a3-4472-bdff-9cd15ec93450"
+    }
+  }
+
+  const getMockMembers = (): any[] => {
+    return [
+      {
+        "action":"None",
+        "instanceName":"VNF1_INSTANCE_NAME",
+        "instanceId":"VNF1_INSTANCE_ID",
+        "orchStatus":null,
+        "productFamilyId":null,
+        "lcpCloudRegionId":null,
+        "tenantId":null,
+        "modelInfo":{
+          "modelInvariantId":"vnf-instance-model-invariant-id",
+          "modelVersionId":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+          "modelVersion":"2.0",
+          "modelName":"vf_vEPDG",
+          "modelType":"vnf"
+        },
+        "instanceType":"VNF1_INSTANCE_TYPE",
+        "provStatus":null,
+        "inMaint":false,
+        "uuid":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+        "originalName":null,
+        "legacyRegion":null,
+        "lineOfBusiness":null,
+        "platformName":null,
+        "trackById":"7a6ee536-f052-46fa-aa7e-2fca9d674c44:002",
+        "serviceInstanceId":"service-instance-id1",
+        "serviceInstanceName":"service-instance-name"
+      },
+      {
+        "action":"None",
+        "instanceName":"VNF2_INSTANCE_NAME",
+        "instanceId":"VNF2_INSTANCE_ID",
+        "orchStatus":null,
+        "productFamilyId":null,
+        "lcpCloudRegionId":null,
+        "tenantId":null,
+        "modelInfo":{
+          "modelInvariantId":"vnf-instance-model-invariant-id",
+          "modelVersionId":"eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+          "modelVersion":"1.0",
+          "modelName":"vf_vEPDG",
+          "modelType":"vnf"
+        },
+        "instanceType":"VNF2_INSTANCE_TYPE",
+        "provStatus":null,
+        "inMaint":true,
+        "uuid":"eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+        "originalName":null,
+        "legacyRegion":null,
+        "lineOfBusiness":null,
+        "platformName":null,
+        "trackById":"eb5f56bf-5855-4e61-bd00-3e19a953bf02:003",
+        "serviceInstanceId":"service-instance-id2",
+        "serviceInstanceName":"service-instance-name"
+      }];
+  };
+});
+
+
+var expectedResult =
+  {
+    'vnfs': {
+      'DROR_vsp': {
+        'rollbackOnFailure': 'true',
+        'vfModules': {},
+        'isMissingData': false,
+        'originalName': 'DROR_vsp',
+        'orchStatus': 'Created',
+        'inMaint': false,
+        'vnfStoreKey' : null,
+        'trackById' : 'abc',
+        'action': 'Create'
+      }
+    },
+    "vnfGroups" :{},
+    "existingVNFCounterMap" : {},
+    "existingVnfGroupCounterMap" : {},
+    "existingNetworksCounterMap" : {},
+    'instanceParams': {},
+    'validationCounter': 0,
+    'existingNames': {},
+    'networks': {},
+    'instanceName': 'Dror123',
+    'orchStatus': 'Active',
+    'modelInavariantId': '35340388-0b82-4d3a-823d-cbddf842be52',
+    'action': 'Create'
+  };
+
+
+var aaiServiceInstnace: RootObject = {
+  "root": {
+    "type": "service-instance",
+    "orchestrationStatus": "Active",
+    "modelVersionId": "4e799efd-fd78-444d-bc25-4a3cde2f8cb0",
+    "modelCustomizationId": "4e799efd-fd78-444d-bc25-4a3cde2f8cb0",
+    "modelInvariantId": "35340388-0b82-4d3a-823d-cbddf842be52",
+    "id": "62888f15-6d24-4f7b-92a7-c3f35beeb215",
+    "name": "Dror123",
+    "children": [
+      {
+        "type": "generic-vnf",
+        "orchestrationStatus": "Created",
+        "provStatus": "PREPROV",
+        "inMaint": true,
+        "modelVersionId": "11c6dc3e-cd6a-41b3-a50e-b5a10f7157d0",
+        "modelCustomizationId": "11c6dc3e-cd6a-41b3-a50e-b5a10f7157d0",
+        "modelInvariantId": "55628ce3-ed56-40bd-9b27-072698ce02a9",
+        "id": "59bde732-9b84-46bd-a59a-3c45fee0538b",
+        "name": "DROR_vsp",
+        "children": []
+      }
+    ]
+  }
+};
diff --git a/vid-webpack-master/src/app/shared/services/aaiService/aai.service.ts b/vid-webpack-master/src/app/shared/services/aaiService/aai.service.ts
new file mode 100644 (file)
index 0000000..1b102e6
--- /dev/null
@@ -0,0 +1,619 @@
+import {NgRedux} from "@angular-redux/store";
+import {HttpClient} from '@angular/common/http';
+import {Injectable} from '@angular/core';
+import * as _ from 'lodash';
+import 'rxjs/add/operator/catch';
+import 'rxjs/add/operator/do';
+import {of} from "rxjs";
+
+import {AicZone} from "../../models/aicZone";
+import {CategoryParams} from "../../models/categoryParams";
+import {LcpRegion} from "../../models/lcpRegion";
+import {LcpRegionsAndTenants} from "../../models/lcpRegionsAndTenants";
+import {OwningEntity} from "../../models/owningEntity";
+import {ProductFamily} from "../../models/productFamily";
+import {Project} from "../../models/project";
+import {SelectOption} from '../../models/selectOption';
+import {ServiceType} from "../../models/serviceType";
+import {Subscriber} from "../../models/subscriber";
+import {Tenant} from "../../models/tenant";
+import {Constants} from '../../utils/constants';
+import {AppState} from "../../store/reducers";
+import {GetAicZonesResponse} from "./responseInterfaces/getAicZonesResponseInterface";
+import {GetCategoryParamsResponseInterface} from "./responseInterfaces/getCategoryParamsResponseInterface";
+import {GetServicesResponseInterface} from "./responseInterfaces/getServicesResponseInterface";
+import {GetSubDetailsResponse} from "./responseInterfaces/getSubDetailsResponseInterface";
+import {GetSubscribersResponse} from "./responseInterfaces/getSubscribersResponseInterface";
+import {Root} from "./model/crawledAaiService";
+import {VnfInstance} from "../../models/vnfInstance";
+import {VfModuleInstance} from "../../models/vfModuleInstance";
+import {ServiceInstance} from "../../models/serviceInstance";
+import {VfModuleMap} from "../../models/vfModulesMap";
+import {
+  updateAicZones,
+  updateCategoryParameters,
+  updateLcpRegionsAndTenants,
+  updateServiceTypes,
+  updateSubscribers,
+  updateUserId
+} from "../../storeUtil/utils/general/general.actions";
+import {updateModel, createServiceInstance} from "../../storeUtil/utils/service/service.actions";
+import {FeatureFlagsService, Features} from "../featureFlag/feature-flags.service";
+import {VnfMember} from "../../models/VnfMember";
+import {setOptionalMembersVnfGroupInstance} from "../../storeUtil/utils/vnfGroup/vnfGroup.actions";
+import {Observable} from "rxjs";
+
+@Injectable()
+export class AaiService {
+  constructor(private http: HttpClient, private store: NgRedux<AppState>, private featureFlagsService:FeatureFlagsService) {
+
+  }
+
+  getServiceModelById = (serviceModelId: string): Observable<any> => {
+    if (_.has(this.store.getState().service.serviceHierarchy, serviceModelId)) {
+      return 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));
+      });
+  };
+
+  getUserId = (): Observable<any> => {
+    return this.http.get("../../getuserID", {responseType: 'text'}).do((res) => this.store.dispatch(updateUserId(res)));
+  };
+
+
+  resolve = (root: Root, serviceInstance: ServiceInstance) => {
+    if (root.type === 'service-instance') {
+      serviceInstance.instanceName = root.name;
+      serviceInstance.orchStatus = root.orchestrationStatus;
+      serviceInstance.modelInavariantId = root.modelInvariantId;
+      for (let i = 0; i < root.children.length; i++) {
+        let child = root.children[i];
+        if (child.type === 'generic-vnf') {
+          let vnf = new VnfInstance();
+          vnf.originalName = child.name;
+          vnf.orchStatus = child.orchestrationStatus
+          if (child.children.length > 0) {
+            let vfModuleMap = new VfModuleMap();
+            for (let j = 0; j < child.children.length; j++) {
+              let child = root.children[i];
+              if (child.type === 'vf-module') {
+                let vfModule = new VfModuleInstance();
+                vfModule.instanceName = child.name;
+                vfModule.orchStatus = child.orchestrationStatus;
+                vfModuleMap.vfModules[child.name] = vfModule;
+              }
+            }
+            vnf.vfModules = {"a": vfModuleMap};
+          }
+          serviceInstance.vnfs[child.name] = vnf;
+
+        }
+      }
+
+    }
+  };
+
+
+  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));
+  };
+
+  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();
+    }
+  };
+
+  getProductFamilies = (): Observable<ProductFamily[]> => {
+
+    let pathQuery: string = Constants.Path.AAI_GET_SERVICES + Constants.Path.ASSIGN + Math.random();
+
+    return this.http.get<GetServicesResponseInterface>(pathQuery).map(res => res.service.map(service => new ProductFamily(service)));
+  };
+
+  getServices = (): Observable<GetServicesResponseInterface> => {
+    let pathQuery: string = Constants.Path.AAI_GET_SERVICES + Constants.Path.ASSIGN + Math.random();
+
+    return this.http.get<GetServicesResponseInterface>(pathQuery);
+  };
+
+  getSubscribers = (): Observable<Subscriber[]> => {
+
+    if (this.store.getState().service.subscribers) {
+      return 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));
+    });
+  };
+
+  getAicZones = (): Observable<AicZone[]> => {
+    if (this.store.getState().service.aicZones) {
+      return 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));
+    });
+  };
+
+  getLcpRegionsAndTenants = (globalCustomerId, serviceType): Observable<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) => {
+      const cloudOwner:string = cloudRegionTenant["cloudOwner"];
+      const cloudRegionId:string = cloudRegionTenant["cloudRegionID"];
+      const name:string = this.extractLcpRegionName(cloudRegionId, cloudOwner);
+      const isPermitted:boolean = cloudRegionTenant["is-permitted"];
+      return new LcpRegion(cloudRegionId, name, isPermitted, cloudOwner);
+    });
+
+    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 extractLcpRegionName(cloudRegionId: string, cloudOwner: string):string {
+   return this.featureFlagsService.getFlagState(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST) ?
+      cloudRegionId+AaiService.formatCloudOwnerTrailer(cloudOwner) : cloudRegionId;
+  };
+
+  public static formatCloudOwnerTrailer(cloudOwner: string):string {
+    return " ("+ cloudOwner.trim().toLowerCase().replace(/^att-/, "").toUpperCase() + ")";
+  }
+
+  getServiceTypes = (subscriberId): Observable<ServiceType[]> => {
+
+    console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: " + subscriberId);
+    if (_.has(this.store.getState().service.serviceTypes, subscriberId)) {
+      return of(<ServiceType[]> 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));
+      });
+  };
+
+  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 [];
+    }
+  };
+
+
+  public retrieveServiceInstanceTopology(serviceInstanceId : string, subscriberId: string, serviceType: string):Observable<ServiceInstance> {
+    let pathQuery: string = `${Constants.Path.AAI_GET_SERVICE_INSTANCE_TOPOLOGY_PATH}${subscriberId}/${serviceType}/${serviceInstanceId}`;
+    return this.http.get<ServiceInstance>(pathQuery);
+  }
+
+  public retrieveAndStoreServiceInstanceTopology(serviceInstanceId: string, subscriberId: string, serviceType: string, serviceModeId: string):Observable<ServiceInstance> {
+    return this.retrieveServiceInstanceTopology(serviceInstanceId, subscriberId, serviceType).do((service:ServiceInstance) => {
+      this.store.dispatch(createServiceInstance(service, serviceModeId));
+      });
+  };
+
+
+  public retrieveServiceInstanceRetryTopology(jobId : string) :Observable<ServiceInstance> {
+    let pathQuery: string = `${Constants.Path.SERVICES_RETRY_TOPOLOGY}/${jobId}`;
+    return this.http.get<ServiceInstance>(pathQuery);
+
+    // return  of(
+    //   <any>{
+    //     "action": "None",
+    //     "instanceName": "LXzQMx9clZl7D6ckJ",
+    //     "instanceId": "service-instance-id",
+    //     "orchStatus": "GARBAGE DATA",
+    //     "productFamilyId": null,
+    //     "lcpCloudRegionId": null,
+    //     "tenantId": null,
+    //     "modelInfo": {
+    //       "modelInvariantId": "d27e42cf-087e-4d31-88ac-6c4b7585f800",
+    //       "modelVersionId": "6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+    //       "modelName": "vf_vEPDG",
+    //       "modelType": "service",
+    //       "modelVersion": "5.0"
+    //     },
+    //     "globalSubscriberId": "global-customer-id",
+    //     "subscriptionServiceType": "service-instance-type",
+    //     "owningEntityId": null,
+    //     "owningEntityName": null,
+    //     "tenantName": null,
+    //     "aicZoneId": null,
+    //     "aicZoneName": null,
+    //     "projectName": null,
+    //     "rollbackOnFailure": null,
+    //     "isALaCarte": false,
+    //     "vnfs": {
+    //       "1e918ade-3dc6-4cec-b952-3ff94ed82d1c": {
+    //         "action": "None",
+    //         "instanceName": "DgZuxjJy5LMIc3755",
+    //         "instanceId": "1e918ade-3dc6-4cec-b952-3ff94ed82d1c",
+    //         "orchStatus": null,
+    //         "productFamilyId": null,
+    //         "lcpCloudRegionId": null,
+    //         "tenantId": null,
+    //         "modelInfo": {
+    //           "modelInvariantId": "vnf-instance-model-invariant-id",
+    //           "modelVersionId": "vnf-instance-model-version-id",
+    //           "modelType": "vnf"
+    //         },
+    //         "instanceType": "SXDBMhwdR9iO0g1Uv",
+    //         "provStatus": null,
+    //         "inMaint": false,
+    //         "uuid": "vnf-instance-model-version-id",
+    //         "originalName": null,
+    //         "legacyRegion": null,
+    //         "lineOfBusiness": null,
+    //         "platformName": null,
+    //         "trackById": "1e918ade-3dc6-4cec-b952-3ff94ed82d1c",
+    //         "vfModules": {},
+    //         "networks": {
+    //           "ff464c97-ea9c-4165-996a-fe400499af3e": {
+    //             "action": "None",
+    //             "instanceName": "ZI0quzIpu8TNXS7nl",
+    //             "instanceId": "ff464c97-ea9c-4165-996a-fe400499af3e",
+    //             "orchStatus": "Assigned",
+    //             "productFamilyId": null,
+    //             "lcpCloudRegionId": null,
+    //             "tenantId": null,
+    //             "modelInfo": {
+    //               "modelInvariantId": "network-instance-model-invariant-id",
+    //               "modelVersionId": "network-instance-model-version-id",
+    //               "modelType": "network"
+    //             },
+    //             "instanceType": "CONTRAIL30_BASIC",
+    //             "provStatus": "prov",
+    //             "inMaint": false,
+    //             "uuid": "network-instance-model-version-id",
+    //             "originalName": null,
+    //             "legacyRegion": null,
+    //             "lineOfBusiness": null,
+    //             "platformName": null,
+    //             "trackById": "ff464c97-ea9c-4165-996a-fe400499af3e",
+    //             "isFailed": true
+    //           },
+    //           "3e41d57c-8bb4-443e-af02-9f86487ba938": {
+    //             "action": "None",
+    //             "instanceName": "0i9asscqSLm7Poeb8",
+    //             "instanceId": "3e41d57c-8bb4-443e-af02-9f86487ba938",
+    //             "orchStatus": "Created",
+    //             "productFamilyId": null,
+    //             "lcpCloudRegionId": null,
+    //             "tenantId": null,
+    //             "modelInfo": {
+    //               "modelInvariantId": "network-instance-model-invariant-id",
+    //               "modelVersionId": "network-instance-model-version-id",
+    //               "modelType": "network"
+    //             },
+    //             "instanceType": "CONTRAIL30_BASIC",
+    //             "provStatus": "prov",
+    //             "inMaint": false,
+    //             "uuid": "network-instance-model-version-id",
+    //             "originalName": null,
+    //             "legacyRegion": null,
+    //             "lineOfBusiness": null,
+    //             "platformName": null,
+    //             "trackById": "3e41d57c-8bb4-443e-af02-9f86487ba938",
+    //             "isFailed": true
+    //           }
+    //         },
+    //         "isFailed": true
+    //       },
+    //       "9a9b2705-c569-4f1b-9a67-13e9f86e6c55": {
+    //         "isFailed": true,
+    //         "action": "None",
+    //         "instanceName": "TFn0SYhrCUs7L3qWS",
+    //         "instanceId": "9a9b2705-c569-4f1b-9a67-13e9f86e6c55",
+    //         "orchStatus": null,
+    //         "productFamilyId": null,
+    //         "lcpCloudRegionId": null,
+    //         "tenantId": null,
+    //         "modelInfo": {
+    //           "modelCustomizationName": "VF_vMee 0",
+    //           "modelInvariantId": "vnf-instance-model-invariant-id",
+    //           "modelVersionId": "d6557200-ecf2-4641-8094-5393ae3aae60",
+    //           "modelType": "vnf"
+    //         },
+    //         "instanceType": "WIT68GUnH34VaGZgp",
+    //         "provStatus": null,
+    //         "inMaint": true,
+    //         "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+    //         "originalName": "VF_vMee 0",
+    //         "legacyRegion": null,
+    //         "lineOfBusiness": null,
+    //         "platformName": null,
+    //         "trackById": "9a9b2705-c569-4f1b-9a67-13e9f86e6c55",
+    //         "vfModules": {
+    //           "vf_vmee0..VfVmee..vmme_vlc..module-1": {
+    //             "2c1ca484-cbc2-408b-ab86-25a2c15ce280": {
+    //               "action": "None",
+    //               "instanceName": "ss820f_0918_db",
+    //               "instanceId": "2c1ca484-cbc2-408b-ab86-25a2c15ce280",
+    //               "orchStatus": "deleted",
+    //               "productFamilyId": null,
+    //               "lcpCloudRegionId": null,
+    //               "tenantId": null,
+    //               "modelInfo": {
+    //                 "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+    //                 "modelCustomizationId": "b200727a-1bf9-4e7c-bd06-b5f4c9d920b9",
+    //                 "modelInvariantId": "09edc9ef-85d0-4b26-80de-1f569d49e750",
+    //                 "modelVersionId": "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+    //                 "modelType": "vfModule"
+    //               },
+    //               "instanceType": null,
+    //               "provStatus": null,
+    //               "inMaint": true,
+    //               "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+    //               "originalName": "VfVmee..vmme_vlc..module-1",
+    //               "legacyRegion": null,
+    //               "lineOfBusiness": null,
+    //               "platformName": null,
+    //               "trackById": "2c1ca484-cbc2-408b-ab86-25a2c15ce280",
+    //               "isBase": false,
+    //               "volumeGroupName": null,
+    //               "isFailed": true
+    //             }
+    //           },
+    //           "dc229cd8-c132-4455-8517-5c1787c18b14": {
+    //             "3ef042c4-259f-45e0-9aba-0989bd8d1cc5": {
+    //               "action": "None",
+    //               "instanceName": "ss820f_0918_base",
+    //               "instanceId": "3ef042c4-259f-45e0-9aba-0989bd8d1cc5",
+    //               "orchStatus": "Assigned",
+    //               "productFamilyId": null,
+    //               "lcpCloudRegionId": null,
+    //               "tenantId": null,
+    //               "modelInfo": {
+    //                 "modelCustomizationId": "8ad8670b-0541-4499-8101-275bbd0e8b6a",
+    //                 "modelInvariantId": "1e463c9c-404d-4056-ba56-28fd102608de",
+    //                 "modelVersionId": "dc229cd8-c132-4455-8517-5c1787c18b14",
+    //                 "modelType": "vfModule"
+    //               },
+    //               "instanceType": null,
+    //               "provStatus": null,
+    //               "inMaint": false,
+    //               "uuid": "dc229cd8-c132-4455-8517-5c1787c18b14",
+    //               "originalName": null,
+    //               "legacyRegion": null,
+    //               "lineOfBusiness": null,
+    //               "platformName": null,
+    //               "trackById": "3ef042c4-259f-45e0-9aba-0989bd8d1cc5",
+    //               "isBase": true,
+    //               "volumeGroupName": null
+    //             }
+    //           }
+    //         },
+    //         "networks": {}
+    //       }
+    //     },
+    //     "networks": {
+    //       "e1edb09e-e68b-4ebf-adb8-e2587be56257": {
+    //         "action": "None",
+    //         "instanceName": "cNpGlYQDsmrUDK5iG",
+    //         "instanceId": "e1edb09e-e68b-4ebf-adb8-e2587be56257",
+    //         "orchStatus": "Created",
+    //         "productFamilyId": null,
+    //         "lcpCloudRegionId": null,
+    //         "tenantId": null,
+    //         "modelInfo": {
+    //           "modelInvariantId": "network-instance-model-invariant-id",
+    //           "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+    //           "modelType": "network"
+    //         },
+    //         "instanceType": "CONTRAIL30_HIMELGUARD",
+    //         "provStatus": "preprov",
+    //         "inMaint": false,
+    //         "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+    //         "originalName": null,
+    //         "legacyRegion": null,
+    //         "lineOfBusiness": null,
+    //         "platformName": null,
+    //         "trackById": "e1edb09e-e68b-4ebf-adb8-e2587be56257"
+    //       },
+    //       "de4b5203-ad1c-4f2b-8843-5236fb8dc9ba": {
+    //         "action": "None",
+    //         "instanceName": "EI9QlSRVK0lon54Cb",
+    //         "instanceId": "de4b5203-ad1c-4f2b-8843-5236fb8dc9ba",
+    //         "orchStatus": "Assigned",
+    //         "productFamilyId": null,
+    //         "lcpCloudRegionId": null,
+    //         "tenantId": null,
+    //         "modelInfo": {
+    //           "modelInvariantId": "network-instance-model-invariant-id",
+    //           "modelVersionId": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+    //           "modelType": "network"
+    //         },
+    //         "instanceType": "CONTRAIL30_BASIC",
+    //         "provStatus": "nvtprov",
+    //         "inMaint": false,
+    //         "uuid": "ddc3f20c-08b5-40fd-af72-c6d14636b986",
+    //         "originalName": null,
+    //         "legacyRegion": null,
+    //         "lineOfBusiness": null,
+    //         "platformName": null,
+    //         "trackById": "de4b5203-ad1c-4f2b-8843-5236fb8dc9ba",
+    //         "isFailed": true
+    //       }
+    //     },
+    //     "vnfGroups": {},
+    //     "validationCounter": 0,
+    //     "existingVNFCounterMap": {
+    //       "vnf-instance-model-version-id": 1,
+    //       "d6557200-ecf2-4641-8094-5393ae3aae60": 1
+    //     },
+    //     "existingNetworksCounterMap": {
+    //       "ddc3f20c-08b5-40fd-af72-c6d14636b986": 2
+    //     },
+    //     "existingVnfGroupCounterMap": {}
+    //   }
+    // );
+
+  }
+
+  public retrieveAndStoreServiceInstanceRetryTopology(jobId: string, serviceModeId : string):Observable<ServiceInstance> {
+    return this.retrieveServiceInstanceRetryTopology(jobId).do((service:ServiceInstance) => {
+      this.store.dispatch(createServiceInstance(service, serviceModeId));
+    });
+  };
+
+  public getOptionalGroupMembers(serviceModelId: string, subscriberId: string, serviceType: string, serviceInvariantId: string, groupType: string, groupRole: string): Observable<VnfMember[]> {
+    let pathQuery: string = `${Constants.Path.AAI_GET_SERVICE_GROUP_MEMBERS_PATH}${subscriberId}/${serviceType}/${serviceInvariantId}/${groupType}/${groupRole}`;
+    if(_.has(this.store.getState().service.serviceInstance[serviceModelId].optionalGroupMembersMap,pathQuery)){
+      return of(<VnfMember[]> JSON.parse(JSON.stringify(this.store.getState().service.serviceInstance[serviceModelId].optionalGroupMembersMap[pathQuery])));
+    }
+    return this.http.get<VnfMember[]>(pathQuery)
+      .do((res) => {
+        this.store.dispatch(setOptionalMembersVnfGroupInstance(serviceModelId, pathQuery, res))
+      });
+    // let res = Observable.of((JSON.parse(JSON.stringify(this.loadMockMembers()))));
+    // return  res;
+     
+  }
+
+  //TODO: make other places use this function
+  extractSubscriberNameBySubscriberId(subscriberId: string) {
+    let result: string = null;
+    let filteredArray: any = _.filter(this.store.getState().service.subscribers, function (o: Subscriber) {
+      return o.id === subscriberId
+    });
+    if (filteredArray.length > 0) {
+      result = filteredArray[0].name;
+    }
+    return result;
+  }
+
+  loadMockMembers(): any {
+    return [
+      {
+        "action":"None",
+        "instanceName":"VNF1_INSTANCE_NAME",
+        "instanceId":"VNF1_INSTANCE_ID",
+        "orchStatus":null,
+        "productFamilyId":null,
+        "lcpCloudRegionId":"mtn23b",
+        "tenantId":"3e9a20a3e89e45f884e09df0cc2d2d2a",
+        "tenantName":"APPC-24595-T-IST-02C",
+        "modelInfo":{
+          "modelInvariantId":"vnf-instance-model-invariant-id",
+          "modelVersionId":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+          "modelVersion":"2.0",
+          "modelName":"vf_vEPDG",
+          "modelType":"vnf"
+        },
+        "instanceType":"VNF1_INSTANCE_TYPE",
+        "provStatus":null,
+        "inMaint":false,
+        "uuid":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+        "originalName":null,
+        "legacyRegion":null,
+        "lineOfBusiness":null,
+        "platformName":null,
+        "trackById":"7a6ee536-f052-46fa-aa7e-2fca9d674c44:002",
+        "serviceInstanceId":"service-instance-id1",
+        "serviceInstanceName":"service-instance-name"
+      },
+      {
+        "action":"None",
+        "instanceName":"VNF2_INSTANCE_NAME",
+        "instanceId":"VNF2_INSTANCE_ID",
+        "orchStatus":null,
+        "productFamilyId":null,
+        "lcpCloudRegionId":"mtn23b",
+        "tenantId":"3e9a20a3e89e45f884e09df0cc2d2d2a",
+        "tenantName":"APPC-24595-T-IST-02C",
+        "modelInfo":{
+          "modelInvariantId":"vnf-instance-model-invariant-id",
+          "modelVersionId":"eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+          "modelVersion":"1.0",
+          "modelName":"vf_vEPDG",
+          "modelType":"vnf"
+        },
+        "instanceType":"VNF2_INSTANCE_TYPE",
+        "provStatus":null,
+        "inMaint":true,
+        "uuid":"eb5f56bf-5855-4e61-bd00-3e19a953bf02",
+        "originalName":null,
+        "legacyRegion":null,
+        "lineOfBusiness":null,
+        "platformName":null,
+        "trackById":"eb5f56bf-5855-4e61-bd00-3e19a953bf02:003",
+        "serviceInstanceId":"service-instance-id2",
+        "serviceInstanceName":"service-instance-name"
+      }
+    ]
+
+  }
+
+
+}
diff --git a/vid-webpack-master/src/app/shared/services/aaiService/model/crawledAaiService.ts b/vid-webpack-master/src/app/shared/services/aaiService/model/crawledAaiService.ts
new file mode 100644 (file)
index 0000000..8c27d43
--- /dev/null
@@ -0,0 +1,30 @@
+
+  export interface Child {
+    type: string;
+    orchestrationStatus: string;
+    provStatus: string;
+    inMaint: boolean;
+    modelVersionId: string;
+    modelCustomizationId: string;
+    modelInvariantId: string;
+    id: string;
+    name: string;
+    children: any[];
+  }
+
+  export interface Root {
+    type: string;
+    orchestrationStatus: string;
+    modelVersionId: string;
+    modelCustomizationId: string;
+    modelInvariantId: string;
+    id: string;
+    name: string;
+    children: Child[];
+  }
+
+  export interface RootObject {
+    root: Root;
+  }
+
+
@@ -1,10 +1,11 @@
 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 {Constants} from "../utils/constants";
+import {Observable} from 'rxjs';
 import {NgRedux} from "@angular-redux/store";
 import {AppState} from "../store/reducers";
+import {updateFlags} from "../storeUtil/utils/global/global.actions";
+import {of} from "rxjs";
 
 @Injectable()
 export class ConfigurationService {
@@ -23,7 +24,7 @@ export class ConfigurationService {
   getFlags(): Observable<{[key: string] : boolean}> {
     let flags = this.store.getState().global.flags;
     if (flags) {
-      return Observable.of(flags);
+      return of(flags);
     }
     let pathQuery = Constants.Path.FEATURES_FLAG_PATH;
     return this._http.get<{[key: string] : boolean}>(pathQuery).map(response => {
index 617dbd3..c4ef881 100644 (file)
@@ -1,33 +1,44 @@
-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> {}
+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';
+import {ServiceNodeTypes} from "../../models/ServiceNodeTypes";
+import {VNFModel} from "../../models/vnfModel";
+class MockAppStore<T> {}
 
 describe('Default Data Generator Service', () => {
   let injector;
   let service: DefaultDataGeneratorService;
   let httpMock: HttpTestingController;
 
-  beforeEach(() => {
+  beforeAll(done => (async () => {
     TestBed.configureTestingModule({
       imports: [HttpClientTestingModule],
-      providers: [DefaultDataGeneratorService,
-        {provide: NgRedux, useClass: MockAppStore}]
+          providers: [DefaultDataGeneratorService,
+            {provide: NgRedux, useClass: MockAppStore}]
     });
+    await TestBed.compileComponents();
 
     injector = getTestBed();
     service = injector.get(DefaultDataGeneratorService);
     httpMock = injector.get(HttpTestingController);
+  })().then(done).catch(done.fail));
+
+  test('generateVFModule aLaCarte vf module object should missed data', () => {
+    const serviceHierarchy = generateServiceHierarchy();
+    const vnfUUID: string = 'VF_vMee 0';
+    const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+
+    let result = service.generateVFModule(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID], [], false, true);
+    expect(result.isMissingData).toBeTruthy();
   });
 
-  it('generateVFModule should create vf module object', () => {
+  test('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);
+    let result = service.generateVFModule(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID], [], false, false);
 
     expect(result.modelInfo.modelType).toEqual('VFmodule');
     expect(result.modelInfo.modelInvariantId).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].invariantUuid);
@@ -37,15 +48,16 @@ describe('Default Data Generator Service', () => {
     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();
+    expect(result.isMissingData).toBeTruthy();
+    expect(result.instanceParams).toEqual([{}]);
   });
 
-  it('generateVNFData should create vnf object', () => {
+  test('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);
+    let result = service.generateVNFData(serviceHierarchy, vnfName, formValues, false);
 
     expect(result.productFamilyId).toEqual(formValues.productFamilyId);
     expect(result.lcpCloudRegionId).toBeNull();
@@ -57,17 +69,343 @@ describe('Default Data Generator Service', () => {
     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.modelCustomizationId).toEqual(serviceHierarchy.vnfs[vnfName].customizationUuid);
+    expect(result.modelInfo.modelUniqueId).toEqual(serviceHierarchy.vnfs[vnfName].customizationUuid);
     expect(result.modelInfo.modelCustomizationName).toEqual(serviceHierarchy.vnfs[vnfName].modelCustomizationName);
+    expect(result.isMissingData).toBeTruthy();
+  });
+
+  describe('#updateDynamicInputsVnfDataFromModel', () => {
+    test('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([]);
+    });
+  });
+
+  describe('#createNewVfModuleTreeNode', () => {
+    test('createNewVfModuleTreeNode with isEcompGeneratedNaming instance name not fill - missing data true', () => {
+      const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+      const vfModuleModel = generateServiceHierarchy().vnfs['VF_vMee 0'].vfModules['vf_vmee0..VfVmee..base_vmme..module-0'];
+      const newVfModule = service.createNewVfModuleTreeNode(<any>{
+        instanceName: "",
+        instanceParams: {},
+        volumeGroupName: "",
+        isMissingData : false,
+        trackById: Math.random().toString()
+      }, vfModuleModel, vnfModuleUUID, false, [], "");
+      expect(newVfModule.name).toEqual('&lt;Automatically Assigned&gt;');
+      expect(newVfModule.missingData).toEqual(true);
+    });
+
+    test('createNewVfModuleTreeNode without isEcompGeneratedNaming missing data false', () => {
+      const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+      const vfModuleModel = generateServiceHierarchy().vnfs['VF_vMee 0'].vfModules['vf_vmee0..VfVmee..base_vmme..module-0'];
+      const newVfModule = service.createNewVfModuleTreeNode(<any>{
+        instanceName: "",
+        instanceParams: {},
+        volumeGroupName: "",
+        isMissingData : false,
+        trackById: Math.random().toString()
+      }, vfModuleModel, vnfModuleUUID, true, [], "");
+      expect(newVfModule.name).toEqual('&lt;Automatically Assigned&gt;');
+      expect(newVfModule.missingData).toEqual(false);
+    });
+  });
+
+  describe('#createNewVnfTreeNode', () => {
+    test('createNewVnfTreeNode with isEcompGeneratedNaming instance name not filled - missing data true', () => {
+      const vnfModel = generateServiceHierarchy().vnfs['VF_vMee 0'];
+      const newVnf = service.createNewTreeNode({
+        uuid : '',
+        instanceName: "",
+        productFamilyId: "productFamilyId",
+        lcpCloudRegionId: "lcpCloudRegionId",
+        legacyRegion: "legacyRegion",
+        tenantId: "tenantId",
+        platformName: "platformName",
+        lineOfBusiness: "lineOfBusiness",
+        rollbackOnFailure: "rollbackOnFailure",
+        originalName : null,
+        vfModules: {},
+        isMissingData: false,
+        trackById: Math.random().toString(),
+        vnfStoreKey: "abc"
+      }, new VNFModel(vnfModel),'VF_vMee 0', 'vnfs');
+      expect(newVnf.name).toEqual('VF_vMee 0');
+      expect(newVnf.missingData).toEqual(true);
+    });
+
+    test('createNewVnfTreeNode with isEcompGeneratedNaming instance name filled - missing data false', () => {
+      const vnfModel = generateServiceHierarchy().vnfs['VF_vMee 0'];
+      const newVnf = service.createNewTreeNode({
+        uuid : '',
+        instanceName: "instanceName",
+        productFamilyId: "productFamilyId",
+        lcpCloudRegionId: "lcpCloudRegionId",
+        legacyRegion: "legacyRegion",
+        tenantId: "tenantId",
+        platformName: "platformName",
+        lineOfBusiness: "lineOfBusiness",
+        rollbackOnFailure: "rollbackOnFailure",
+        originalName : null,
+        vfModules: {},
+        isMissingData: false,
+        trackById: Math.random().toString(),
+        vnfStoreKey: "abc"
+      }, vnfModel,'VF_vMee 0', 'vnfs');
+      expect(newVnf.name).toEqual("instanceName");
+      expect(newVnf.missingData).toEqual(false);
+    });
   });
+
 });
 
 
 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":{}}');
+  return JSON.parse('{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Emanuel","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"10.0.0.10","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"10.0.0.10","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":"false","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"10.0.0.10","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"10.0.0.10","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:11:22:EF:AC:DF","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:11:22:EF:AC:DF","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"}');
+  return JSON.parse('{"globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","productFamilyId":"vTerrance","subscriptionServiceType":"TYLER SILVIA","lcpCloudRegionId":"hvf6","tenantId":"1178612d2b394be4834ad77f567c0af2","aicZoneId":"JAG1","projectName":"WATKINS","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"},"tenantName":"AIN Web Tool-15-D-SSPtestcustome","aicZoneName":"YUDFJULP-JAG1"}');
+}
+
+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': '10.0.0.10',
+      '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': '10.0.0.10',
+      'is_AVPN_service': 'false',
+      'vmx_RSG_name': 'vREXI-affinity',
+      'vmx_int_ctl_forwarding': 'l2',
+      'vmxvre_oam_ip_0': '10.0.0.10',
+      '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': '10.0.0.10',
+      '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.0.0.10',
+      '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': {}
+  };
 }
index b1e676f..b0baa82 100644 (file)
-import { Injectable } from '@angular/core';
+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';
+
+import {NgRedux} from '@angular-redux/store';
+import {AppState} from '../../store/reducers';
+import {VnfTreeNode} from "../../models/vnfTreeNode";
+import {VfModuleInstance} from "../../models/vfModuleInstance";
+import {VfModule} from "../../models/vfModule";
+import {VfModuleTreeNode} from "../../models/vfModuleTreeNode";
+import {InputType} from "../../models/inputTypes";
+import {ServiceNodeTypes} from "../../models/ServiceNodeTypes";
+import {Constants} from "../../utils/constants";
+import {Utils} from "../../utils/utils";
+import {NetworkTreeNode} from "../../models/networkTreeNode";
+import {createVNFInstance} from "../../storeUtil/utils/vnf/vnf.actions";
+import {changeInstanceCounter} from "../../storeUtil/utils/general/general.actions";
+import {createNetworkInstance} from "../../storeUtil/utils/network/network.actions";
+import {createVFModuleInstance} from "../../storeUtil/utils/vfModule/vfModule.actions";
+import {createVnfGroupInstance} from "../../storeUtil/utils/vnfGroup/vnfGroup.actions";
+import {VnfGroupTreeNode} from "../../models/vnfGroupTreeNode";
+import {ModelInfo} from "../../models/modelInfo";
+import {ServiceInstanceActions} from "../../models/serviceInstanceActions";
+import Parameter = Constants.Parameter;
 
 @Injectable()
 export class DefaultDataGeneratorService {
   static controlsFieldsStatus = {};
+  public requiredFields = {
+    VF: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM],
+    Network: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM],
+    VL: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM],
+    VFmodule: [],
+    VnfGroup: []
+  };
+
+  constructor(private store: NgRedux<AppState>) {
+  }
+
+  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) {
+                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;
+          }
+        }
+      }
+    }
+  };
+
+  updateDynamicInputsVnfDataFromModel(modelType: string, model: any): any[] {
+    let displayInputs;
+    if (modelType === ServiceNodeTypes.VFmodule) {
+      displayInputs = model.inputs;
+    }
+    return _.isEmpty(displayInputs) ? [] : this.getArbitraryInputs(displayInputs);
+  }
+
+  updateNetworksOnFirstSet(serviceId: string, formServiceValues: any){
+    const serviceHierarchy = this.store.getState().service.serviceHierarchy[serviceId];
+    if (serviceHierarchy && !_.isEmpty(serviceHierarchy.networks)) {
+      for (let networkUUID in serviceHierarchy.networks) {
+        const isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(serviceHierarchy.networks[networkUUID]);
+        let min_vnf_instances_greater_than_0 = serviceHierarchy.networks[networkUUID].properties['min_instances'] && serviceHierarchy.networks[networkUUID].properties['min_instances'] > 0;
+        if(this.store.getState().global.flags['FLAG_DEFAULT_VNF'] &&  min_vnf_instances_greater_than_0)
+        {
+          this.createNetworkInstanceReduxIfNotExist(
+            serviceId,
+            this.generateNetworkData(serviceHierarchy, networkUUID, formServiceValues, isEcompGeneratedNaming)
+          );
+        }
+      }
+    }
+  }
 
-  constructor(private store: NgRedux<AppState>) { }
+  updateVnfGroupsOnFirstSet(serviceId: string, formServiceValues: any){
+    const serviceHierarchy = this.store.getState().service.serviceHierarchy[serviceId];
+    if (serviceHierarchy && !_.isEmpty(serviceHierarchy.vnfGroups)) {
+      for (let vnfGroupUUID in serviceHierarchy.vnfGroups) {
+        const isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(serviceHierarchy.vnfGroups[vnfGroupUUID]);
+        let min_vnf_group_instances_greater_than_0 = serviceHierarchy.vnfGroups[vnfGroupUUID].properties['min_instances'] && serviceHierarchy.vnfGroups[vnfGroupUUID].properties['min_instances'] > 0;
+        if(this.store.getState().global.flags['FLAG_DEFAULT_VNF'] &&  min_vnf_group_instances_greater_than_0)
+        {
+          this.createVnfGroupInstanceReduxIfNotExist(
+            serviceId,
+            this.generateVnfGroupData(serviceHierarchy, vnfGroupUUID, formServiceValues, isEcompGeneratedNaming)
+          );
+        }
+      }
+    }
+  }
 
   updateReduxOnFirstSet(serviceId: string, formServiceValues: any): void {
+    this.updateNetworksOnFirstSet(serviceId, formServiceValues);
+    this.updateVnfGroupsOnFirstSet(serviceId, formServiceValues);
     const serviceHierarchy = this.store.getState().service.serviceHierarchy[serviceId];
     if (serviceHierarchy && !_.isEmpty(serviceHierarchy.vnfs)) {
       for (let vnfUUID in serviceHierarchy.vnfs) {
+        const isEcompGeneratedNaming = this.getIsEcompGeneratedNaming(serviceHierarchy.vnfs[vnfUUID]);
         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
-            );
+          const vfModuleModel = serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID];
+          if (vfModuleModel.properties.minCountInstances > 0) {
+            let vfModule = this.generateVFModule(vfModuleModel, this.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, vfModuleModel), isEcompGeneratedNaming, formServiceValues.isALaCarte);
+            if (vfModuleModel.properties.initialCount > 0) {
+              this.createVNFInstanceReduxIfNotExist(
+                serviceId,
+                this.generateVNFData(serviceHierarchy, vnfUUID, formServiceValues, isEcompGeneratedNaming)
+              );
+
+              this.addDefaultVfModulesInRedux(
+                serviceId,
+                vfModuleModel.properties.initialCount,
+                vfModule,
+                vnfModuleUUID,
+                vnfUUID
+              )
+
+            }
           }
         }
+
+        let min_vnf_instances_greater_than_0 = serviceHierarchy.vnfs[vnfUUID].properties['min_instances'] && serviceHierarchy.vnfs[vnfUUID].properties['min_instances'] > 0;
+        if(this.store.getState().global.flags['FLAG_DEFAULT_VNF'] &&  min_vnf_instances_greater_than_0)
+        {
+          this.createVNFInstanceReduxIfNotExist(
+            serviceId,
+            this.generateVNFData(serviceHierarchy, vnfUUID, formServiceValues, isEcompGeneratedNaming)
+          );
+        }
       }
     }
   }
 
-  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));
-      }
+
+  private getIsEcompGeneratedNaming(vnfJson) {
+    const ecompGeneratedNaming = vnfJson.properties.ecomp_generated_naming;
+    return ecompGeneratedNaming === "true";
+  };
+
+  createVNFInstanceReduxIfNotExist(serviceId: string, vnfData: any): void {
+    if(!this.store.getState().service.serviceInstance[serviceId].vnfs[vnfData.modelInfo.modelCustomizationName]){
+      this.store.dispatch(createVNFInstance(vnfData, vnfData.modelInfo.modelCustomizationName, serviceId));
+      this.store.dispatch(changeInstanceCounter(vnfData.modelInfo.modelUniqueId, serviceId, 1, <any> {data : {type : 'VF'}}));
+    }
+  }
+
+  createNetworkInstanceReduxIfNotExist(serviceId: string, networkData: any): void {
+    if(!this.store.getState().service.serviceInstance[serviceId].vnfs[networkData.modelInfo.modelCustomizationName]){
+      this.store.dispatch(createNetworkInstance(networkData, networkData.modelInfo.modelCustomizationName, serviceId));
+      this.store.dispatch(changeInstanceCounter(networkData.modelInfo.modelUniqueId, serviceId, 1, <any> {data : {type : 'VL'}}));
     }
   }
 
+  createVnfGroupInstanceReduxIfNotExist(serviceId: string, vnfGroupData: any): void {
+    if(!this.store.getState().service.serviceInstance[serviceId].vnfGroups[vnfGroupData.modelInfo.modelCustomizationName]){
+      this.store.dispatch(createVnfGroupInstance(vnfGroupData, vnfGroupData.modelInfo.modelCustomizationName, serviceId));
+      this.store.dispatch(changeInstanceCounter(vnfGroupData.modelInfo.modelUniqueId , serviceId, 1, <any> {data : {type : 'VnfGroup'}}));
+    }
+  }
+
+  addDefaultVfModulesInRedux(serviceId: string, numberOfVfModules: number, vfModuleData: any, vfModuleName: string, vnfUUID : string){
+    for (let i = 0; i < numberOfVfModules; i++) {
+      this.store.dispatch(createVFModuleInstance(vfModuleData, vfModuleName, serviceId, null, vnfUUID));
+    }
+  }
 
-  generateVFModule(serviceHierarchy: any, vnfUUID: string, vnfModuleUUID: string) {
+  generateVnfGroupInstance(vnfGroupModel: any, isEcompGeneratedNaming : boolean, isALaCarte: boolean, instanceName: string) {
+    let modelInfo = new ModelInfo(vnfGroupModel);
+    let instanceParams = {};
     return {
+      'uuid' : modelInfo.uuid,
+      'action': ServiceInstanceActions.Create,
+      'instanceName': (!isEcompGeneratedNaming) ? instanceName : null,
+      'isMissingData' : false,
+      'modelInfo': modelInfo,
+      'rollbackOnFailure' : "true",
+      'instanceParams': [
+        instanceParams
+      ],
+      'trackById': DefaultDataGeneratorService.createRandomTrackById()
+    };
+  }
+
+
+  generateVFModule(vfModule: any, dynamicInputs: any, isEcompGeneratedNaming : boolean, isALaCarte: boolean) {
+    let instanceParams = {};
+    dynamicInputs.forEach(field => {
+      instanceParams[field.id] = field.value;
+    });
+    return {
+      'isMissingData' : this.setIsMissingData(ServiceNodeTypes.VFmodule, dynamicInputs, isEcompGeneratedNaming, isALaCarte),
       '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
+        'modelInvariantId': vfModule.invariantUuid,
+        'modelVersionId': vfModule.uuid,
+        'modelName': vfModule.name,
+        'modelVersion': vfModule.version,
+        'modelCustomizationId': vfModule.customizationUuid,
+        'modelCustomizationName': vfModule.modelCustomizationName,
+        'modelUniqueId' : vfModule.customizationUuid || vfModule.uuid
       },
       'instanceParams': [
-        {}
-      ]
+        instanceParams
+      ],
+      'trackById': DefaultDataGeneratorService.createRandomTrackById(),
     };
   }
 
-  generateVNFData(serviceHierarchy: any, vnfName: string, vnfUUID: string, formValues: any) {
+  setIsMissingData(type: string, dynamicInputs: any, isEcompGeneratedNaming: boolean, isAlaCarte?: boolean): boolean {
+    if (isAlaCarte || !isEcompGeneratedNaming || this.requiredFields[type].length > 0) {
+      return true;
+    }
+
+    if (dynamicInputs) {
+      for(let input of dynamicInputs) {
+        if (input.isRequired && _.isEmpty(input.value)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  generateVNFData(serviceHierarchy: any, vnfName: string, formValues: any, isEcompGeneratedNaming) {
     return {
+      'uuid' : serviceHierarchy.vnfs[vnfName].uuid,
+      'isMissingData' :this.setIsMissingData(ServiceNodeTypes.VF, [], isEcompGeneratedNaming),
       'productFamilyId': formValues.productFamilyId,
       'lcpCloudRegionId': null,
       'tenantId': null,
@@ -73,10 +361,100 @@ export class DefaultDataGeneratorService {
         'modelVersionId': formValues.modelInfo.modelVersionId,
         'modelName': serviceHierarchy.vnfs[vnfName].name,
         'modelVersion': serviceHierarchy.vnfs[vnfName].version,
-        'modelCustomizationId': serviceHierarchy.vnfs[vnfName].modelCustomizationId,
-        'modelCustomizationName': serviceHierarchy.vnfs[vnfName].modelCustomizationName
+        'modelCustomizationId': serviceHierarchy.vnfs[vnfName].customizationUuid,
+        'modelCustomizationName': serviceHierarchy.vnfs[vnfName].modelCustomizationName,
+        'modelUniqueId' : serviceHierarchy.vnfs[vnfName].customizationUuid || serviceHierarchy.vnfs[vnfName].uuid,
       },
-      'isUserProvidedNaming': null
+      'trackById': DefaultDataGeneratorService.createRandomTrackById(),
     }
   }
+
+  generateNetworkData(serviceHierarchy: any, networkName: string, formValues: any, isEcompGeneratedNaming) {
+      return {
+        'uuid' : serviceHierarchy.network[networkName].uuid,
+        'isMissingData' :this.setIsMissingData(ServiceNodeTypes.VL, [], isEcompGeneratedNaming),
+        'productFamilyId': formValues.productFamilyId,
+        'lcpCloudRegionId': null,
+        'tenantId': null,
+        'lineOfBusiness': null,
+        'platformName': null,
+        'modelInfo': {
+          'modelType': 'VF',
+          'modelInvariantId': serviceHierarchy.network[networkName].invariantUuid,
+          'modelVersionId': formValues.modelInfo.modelVersionId,
+          'modelName': serviceHierarchy.network[networkName].name,
+          'modelVersion': serviceHierarchy.network[networkName].version,
+          'modelCustomizationId': serviceHierarchy.network[networkName].modelCustomizationId,
+          'modelCustomizationName': serviceHierarchy.network[networkName].modelCustomizationName,
+          'modelUniqueId' : serviceHierarchy.network[networkName].modelCustomizationId || serviceHierarchy.network[networkName].uuid,
+        },
+        'trackById': DefaultDataGeneratorService.createRandomTrackById(),
+      }
+    }
+
+  generateVnfGroupData(serviceHierarchy: any, vnfGroupName: string, formValues: any, isEcompGeneratedNaming) {
+    return {
+      'uuid' : serviceHierarchy.vnfGroups[vnfGroupName].uuid,
+      'isMissingData' :this.setIsMissingData(ServiceNodeTypes.VnfGroup, [], isEcompGeneratedNaming),
+      'platformName': null,
+      'modelInfo': {
+        'modelType': 'VnfGroup',
+        'modelInvariantId': serviceHierarchy.vnfGroups[vnfGroupName].invariantUuid,
+        'modelVersionId': formValues.modelInfo.modelVersionId,
+        'modelName': serviceHierarchy.vnfGroups[vnfGroupName].name,
+        'modelVersion': serviceHierarchy.vnfGroups[vnfGroupName].version,
+        'modelCustomizationId': serviceHierarchy.vnfGroups[vnfGroupName].modelCustomizationId,
+        'modelCustomizationName': serviceHierarchy.vnfGroups[vnfGroupName].modelCustomizationName,
+        'modelUniqueId' : serviceHierarchy.vnfGroups[vnfGroupName].modelCustomizationId || serviceHierarchy.vnfGroups[vnfGroupName].uuid,
+
+      },
+      'trackById': DefaultDataGeneratorService.createRandomTrackById(),
+    }
+  }
+
+
+  static createRandomTrackById() {
+    return Math.random().toString(36).slice(2);
+  }
+
+  private checkMissingData(instance, type: string, dynamicInputs: any, isEcompGeneratedNaming: boolean): boolean {
+    if (!isEcompGeneratedNaming && _.isEmpty(instance.instanceName)) {
+      return true;
+    }
+
+    for (let field of this.requiredFields[type]) {
+      if (_.isEmpty(instance[field])) {
+        return true;
+      }
+    }
+
+    for (let field of dynamicInputs) {
+      if (field.isRequired && !_.isNil(instance.instanceParams) && _.isEmpty(instance.instanceParams[0][field.id])) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  createNewTreeNode(instance: any, model: any, storeKey : string, type : string): VnfTreeNode {
+    let tmp  = null;
+    if(type === 'vnfs') {
+      tmp = new VnfTreeNode(instance, model, storeKey);
+    }else if (type === 'vnfGroups') {
+      tmp = new VnfGroupTreeNode(instance, model, storeKey);
+    }else {
+      tmp = new NetworkTreeNode(instance, model, storeKey);
+    }
+    tmp.missingData = this.checkMissingData(instance, ServiceNodeTypes.VF, [], model.isEcompGeneratedNaming);
+
+    return tmp;
+  }
+
+  createNewVfModuleTreeNode(instance: VfModuleInstance, vfModuleModel: VfModule, vfModuleModelName: string, isEcompGeneratedNamig: boolean, dynamicInputs, dynamicModelName  :string): VfModuleTreeNode {
+    let newVfModule: VfModuleTreeNode = new VfModuleTreeNode(instance, vfModuleModel, vfModuleModelName, dynamicInputs, isEcompGeneratedNamig, dynamicModelName);
+    newVfModule.missingData = this.checkMissingData(instance, ServiceNodeTypes.VFmodule, dynamicInputs, isEcompGeneratedNamig);
+    return newVfModule;
+  }
+
 }
diff --git a/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.spec.ts b/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.spec.ts
new file mode 100644 (file)
index 0000000..847af66
--- /dev/null
@@ -0,0 +1,47 @@
+import {FeatureFlagsService, Features} from "./feature-flags.service";
+import {getTestBed, TestBed} from "@angular/core/testing";
+import {NgRedux} from "@angular-redux/store";
+import each from 'jest-each';
+let flagValue:boolean;
+
+class MockReduxStore<T> {
+
+  getState() {
+    return {
+      "global": {
+        "flags": {
+          "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": flagValue,
+        },
+      },
+    }
+  };
+}
+
+describe('Feature flags Service', () => {
+
+  let injector;
+  let service: FeatureFlagsService;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      providers: [
+        FeatureFlagsService,
+        {provide: NgRedux, useClass: MockReduxStore}]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(FeatureFlagsService);
+
+  })().then(done).catch(done.fail));
+
+    let flagValueDataProvider = [
+      ['flag is true', true],
+      ['flag is false', false]
+    ];
+
+    each(flagValueDataProvider).test("should return the correct flag %s", (desc: string, flag: boolean) => {
+        flagValue = flag;
+        expect(service.getFlagState(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).toEqual(flag);
+    });
+});
diff --git a/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.ts b/vid-webpack-master/src/app/shared/services/featureFlag/feature-flags.service.ts
new file mode 100644 (file)
index 0000000..ec7bb02
--- /dev/null
@@ -0,0 +1,29 @@
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {Injectable} from "@angular/core";
+
+export enum Features {
+  FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST='FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST',
+  FLAG_1902_NEW_VIEW_EDIT='FLAG_1902_NEW_VIEW_EDIT',
+  FLAG_1902_VNF_GROUPING='FLAG_1902_VNF_GROUPING',
+  FLAG_VF_MODULE_RESUME_STATUS_CREATE = 'FLAG_VF_MODULE_RESUME_STATUS_CREATE',
+  DRAG_AND_DROP_OPERATION = 'DRAG_AND_DROP_OPERATION',
+  FLAG_1906_COMPONENT_INFO = 'FLAG_1906_COMPONENT_INFO',
+}
+
+@Injectable()
+export class FeatureFlagsService {
+
+  constructor(private store: NgRedux<AppState>){}
+
+  public getFlagState(flag: Features):boolean {
+    return FeatureFlagsService.getFlagState(flag, this.store);
+  }
+
+  /*static method for easy refactoring of code, so no injection of FeatureFlagsService is needed*/
+  public static getFlagState(flag: Features, store: NgRedux<AppState>):boolean {
+    return store.getState().global.flags[flag];
+  }
+
+
+}
diff --git a/vid-webpack-master/src/app/shared/services/msoService/mso.service.spec.ts b/vid-webpack-master/src/app/shared/services/msoService/mso.service.spec.ts
new file mode 100644 (file)
index 0000000..9142e8d
--- /dev/null
@@ -0,0 +1,37 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {MsoService} from './mso.service';
+import {Constants} from "../../utils/constants";
+
+
+describe('Mso Service', () => {
+  let injector;
+  let service: MsoService;
+  let httpMock: HttpTestingController;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [MsoService]
+    });
+    await TestBed.compileComponents();
+
+
+    injector = getTestBed();
+    service = injector.get(MsoService);
+    httpMock = injector.get(HttpTestingController);
+
+  })().then(done).catch(done.fail));
+
+  describe('#instantiation status tests ', ()=> {
+    test('retry should send the right request', ()=>{
+      const jobId: string = '111';
+
+      service.retryMsoTask(jobId).subscribe();
+      const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH  + '/retry/' + jobId);
+
+      expect(req.request.method).toBe('POST');
+    });
+  });
+
+});
diff --git a/vid-webpack-master/src/app/shared/services/msoService/mso.service.ts b/vid-webpack-master/src/app/shared/services/msoService/mso.service.ts
new file mode 100644 (file)
index 0000000..7d31c6f
--- /dev/null
@@ -0,0 +1,38 @@
+import {Injectable} from "@angular/core";
+import {HttpClient} from "@angular/common/http";
+import {Observable} from "rxjs";
+import {Constants} from "../../utils/constants";
+import {ServiceInstance} from "../../models/serviceInstance";
+
+@Injectable()
+export class MsoService {
+  httpClient: HttpClient;
+
+  constructor(http: HttpClient) {
+    this.httpClient = http;
+  }
+
+
+  public submitMsoTask(instanceFields): Observable<any> {
+    let path = Constants.Path.SERVICES_JOB_INFO_PATH + '/bulk';
+    return this.httpClient.post(path, instanceFields);
+  }
+
+  public retryMsoTask(jobId: string): Observable<any> {
+    let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH + '/retry/' + jobId;
+    return this.httpClient.post<any>(pathQuery, null);
+  }
+
+  public retryBulkMsoTask(jobId: string, instanceFields: ServiceInstance): Observable<any> {
+    let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH + '/retryJobWithChangedData/'+ jobId;
+    return this.httpClient.post<any>(pathQuery, instanceFields);
+  }
+
+  public createVnf(requestDetails, serviceInstanceId): Observable<any> {
+    let pathQuery: string = Constants.Path.MSO_CREATE_VNF_INSTANCE + serviceInstanceId;
+
+    return this.httpClient.post( pathQuery, {
+      requestDetails : requestDetails
+    });
+  }
+}
index ab6ecaa..57af070 100644 (file)
@@ -1,33 +1,77 @@
-import {NgModule, ModuleWithProviders} from '@angular/core';
+import {ModuleWithProviders, NgModule} 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 {BrowserModule} from '@angular/platform-browser';
+import {HttpClientModule} from '@angular/common/http';
+import {ServiceInfoService} from './server/serviceInfo/serviceInfo.service';
+import {ModalModule, PopoverModule} from 'ngx-bootstrap';
+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 {HttpInterceptorService} from './utils/httpInterceptor/httpInterceptor.service';
+import {FormControlErrorComponent} from './components/formControlError/formControlError.component';
+import {DropdownFormControlComponent} from "./components/formControls/component/dropdown/dropdown.formControl.component";
+import {InputPreventionPatternDirective} from './directives/inputPrevention/inputPreventionPattern.directive';
+import {FormGeneralErrorsComponent} from './components/formGeneralErrors/formGeneralErrors.component';
+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 {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";
+import {ConfigurationService} from "./services/configuration.service";
+import {InputFormControlComponent} from "./components/formControls/component/input/input.formControl.component";
+import {MultiselectFormControlComponent} from "./components/formControls/component/multiselect/multiselect.formControl.component";
+import {FormsModule, ReactiveFormsModule} from "@angular/forms";
+import {FormControlMessageErrorComponent} from "./components/formControls/errorMessage/formControlMessageError.component";
+import {GenericFormPopupComponent} from "./components/genericFormPopup/generic-form-popup.component";
+import {CheckboxFormControlComponent} from "./components/formControls/component/checkbox/checkbox.formControl.component";
+import {GenericFormService} from "./components/genericForm/generic-form.service";
+import {GenericFormComponent} from "./components/genericForm/generic-form.component";
+import {ServiceControlGenerator} from "./components/genericForm/formControlsServices/service.control.generator";
+import {BasicControlGenerator} from "./components/genericForm/formControlsServices/basic.control.generator";
+import {CustomValidators} from "./validators/uniqueName/uniqueName.validator";
+import {FileFormControlComponent} from "./components/formControls/component/file/file.formControl.component";
+import {NumberFormControlComponent} from "./components/formControls/component/number/number.formControl.component";
+import {AngularMultiSelectModule} from 'angular2-multiselect-dropdown';
+import {VnfControlGenerator} from "./components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator";
+import {NetworkPopupService} from "./components/genericFormPopup/genericFormServices/network/network.popup.service";
+import {NetworkControlGenerator} from "./components/genericForm/formControlsServices/networkGenerator/network.control.generator";
+import {BasicPopupService} from "./components/genericFormPopup/genericFormServices/basic.popup.service";
+import {VfModulePopuopService} from "./components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service";
+import {VfModuleControlGenerator} from "./components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {OrderByPipe} from "./pipes/order/orderBy.pipe";
+import {ServicePopupService} from "./components/genericFormPopup/genericFormServices/service/service.popup.service";
+import {GenericFormPopupService} from "./components/genericFormPopup/generic-form-popup.service";
+import {FormGeneralErrorsService} from "./components/formGeneralErrors/formGeneralErrors.service";
+import {VnfPopupService} from "./components/genericFormPopup/genericFormServices/vnf/vnf.popup.service";
+import {SdcUiComponentsModule, SdcUiServices} from "onap-ui-angular";
+import {SafePipe} from "./pipes/safe/safe.pipe";
+import {ViewEditResolver} from "./resolvers/viewEdit/viewEdit.resolver";
+import {FlagsResolve} from "./resolvers/flag/flag.resolver";
+import {FeatureFlagModule} from "../featureFlag/featureFlag.module";
+import {VnfGroupPopupService} from "./components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service";
+import {VnfGroupControlGenerator} from "./components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator";
+import {AuditInfoModalComponent} from "./components/auditInfoModal/auditInfoModal.component";
+import {BootstrapModalModule} from 'ng2-bootstrap-modal';
+import {DataTableModule} from "angular2-datatable";
+import {AuditInfoModalComponentService} from "./components/auditInfoModal/auditInfoModal.component.service";
+import {SearchMembersModalComponent} from "./components/searchMembersModal/search-members-modal.component";
+import {MembersTableComponent} from "./components/searchMembersModal/members-table/members-table.component";
+import {MembersTableService} from "./components/searchMembersModal/members-table/members-table.service";
+import {ObjectToArrayPipe} from "./pipes/objectToArray/objectToArray.pipe";
+import {DataFilterPipe} from "./pipes/dataFilter/data-filter.pipe";
+import {SvgComponent} from "./components/svg/svg-component";
+import {ErrorMsgComponent} from './components/error-msg/error-msg.component';
+import {ErrorMsgService} from "./components/error-msg/error-msg.service";
+import {RetryResolver} from "./resolvers/retry/retry.resolver";
+import {ClickOutsideDirective} from "./directives/clickOutside/clickOutside.directive";
+import {DynamicInputsComponent} from "./components/dynamic-inputs/dynamic-inputs.component";
+import {DynamicInputLabelPipe} from "./pipes/dynamicInputLabel/dynamic-input-label.pipe";
+import {ModelInformationService} from "./components/model-information/model-information.service";
 
 
 @NgModule({
@@ -37,49 +81,119 @@ import {FlagsResolve} from "../services/flags.resolve";
     CommonModule,
     RouterModule,
     PopoverModule.forRoot(),
-    AngularSvgIconModule,
+    FeatureFlagModule.forRoot(),
+    FormsModule,
+    ReactiveFormsModule,
     TooltipModule,
     SdcUiComponentsModule,
+    AngularMultiSelectModule,
+    BootstrapModalModule,
+    DataTableModule,
+    ModalModule.forRoot()
   ],
   declarations: [
     PopoverComponent,
-    SvgDirective,
     EllipsisComponent,
     MessageBoxComponent,
     FormControlErrorComponent,
+    DropdownFormControlComponent,
+    MultiselectFormControlComponent,
+    FileFormControlComponent,
+    NumberFormControlComponent,
     InputPreventionPatternDirective,
+    ClickOutsideDirective,
     FormGeneralErrorsComponent,
     SpinnerComponent,
     NoContentMessageAndIconComponent,
     ModelInformationComponent,
     CapitalizeAndFormatPipe,
     ServiceInfoPipe,
+    OrderByPipe,
+    SafePipe,
+    ObjectToArrayPipe,
+    DataFilterPipe,
+    InputFormControlComponent,
+    FormControlMessageErrorComponent,
+    GenericFormPopupComponent,
+    SearchMembersModalComponent,
+    AuditInfoModalComponent,
+    GenericFormComponent,
+    CheckboxFormControlComponent,
+    MembersTableComponent,
+    SvgComponent,
+    ErrorMsgComponent,
+    DynamicInputsComponent,
+    DynamicInputLabelPipe
   ],
   exports: [
     PopoverComponent,
-    SvgDirective,
     EllipsisComponent,
     MessageBoxComponent,
     FormControlErrorComponent,
+    DropdownFormControlComponent,
     InputPreventionPatternDirective,
+    ClickOutsideDirective,
     FormGeneralErrorsComponent,
     SpinnerComponent,
     NoContentMessageAndIconComponent,
     ModelInformationComponent,
     CapitalizeAndFormatPipe,
     ServiceInfoPipe,
+    OrderByPipe,
+    SafePipe,
+    ObjectToArrayPipe,
+    DataFilterPipe,
+    InputFormControlComponent,
+    FormControlMessageErrorComponent,
+    GenericFormPopupComponent,
+    SearchMembersModalComponent,
+    AuditInfoModalComponent,
+    GenericFormComponent,
+    CheckboxFormControlComponent,
+    MembersTableComponent,
+    ErrorMsgComponent,
+    SvgComponent,
+    DynamicInputsComponent,
+    DynamicInputLabelPipe
+  ],
+  entryComponents : [
+    GenericFormPopupComponent,
+    SearchMembersModalComponent
   ],
   providers: [
     ServiceInfoService,
     MessageBoxService,
-    SdcUiComponents.ModalService,
+    SdcUiServices.ModalService,
+    SdcUiServices.LoaderService,
     HttpInterceptorService,
     IframeService,
-    NumbersLettersUnderscoreValidator,
     DefaultDataGeneratorService,
-    HealthStatusService,
     ConfigurationService,
-    FlagsResolve
+    GenericFormService,
+    FlagsResolve,
+    ViewEditResolver,
+    RetryResolver,
+    ServiceControlGenerator,
+    ServicePopupService,
+    VnfControlGenerator,
+    VfModuleControlGenerator,
+    BasicControlGenerator,
+    CustomValidators,
+    NetworkPopupService,
+    VfModulePopuopService,
+    NetworkControlGenerator,
+    VnfGroupControlGenerator,
+    VnfGroupPopupService,
+    BasicPopupService,
+    GenericFormPopupService,
+    FormGeneralErrorsService,
+    VnfPopupService,
+    AuditInfoModalComponentService,
+    VnfPopupService,
+    MembersTableService,
+    ErrorMsgService,
+    DataFilterPipe,
+    ModelInformationService,
   ]
 })
 export class SharedModule {
similarity index 88%
rename from vid-webpack-master/src/app/store/epics.ts
rename to vid-webpack-master/src/app/shared/store/epics.ts
index f424e73..c7b190d 100644 (file)
@@ -1,13 +1,11 @@
 import { Injectable } from '@angular/core';
-
 import {AAIEpics} from "../services/aaiService/aai.epics";
 
 @Injectable()
 export class RootEpics {
   constructor(private aaiEpics: AAIEpics) {}
 
-  public createEpics() {
+  public createEpics()  {
     return this.aaiEpics.createEpic();
-    
   }
 }
diff --git a/vid-webpack-master/src/app/shared/store/module.ts b/vid-webpack-master/src/app/shared/store/module.ts
new file mode 100644 (file)
index 0000000..5a81f36
--- /dev/null
@@ -0,0 +1,36 @@
+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";
+import {createEpicMiddleware} from "redux-observable";
+import {AaiService} from "../services/aaiService/aai.service";
+import {applyMiddleware, createStore} from "redux";
+
+@NgModule({
+  imports: [NgReduxModule],
+  providers: [RootEpics, AAIEpics],
+})
+
+export class StoreModule {
+  constructor(
+    public store: NgRedux<AppState>,
+    private aaiService : AaiService,
+    devTools: DevToolsExtension,
+    rootEpics: RootEpics,
+  ) {
+    const epicMiddleware = createEpicMiddleware();
+    const persistedState = sessionStorage.getItem('reduxState') ?
+      JSON.parse(sessionStorage.getItem('reduxState')) : {};
+
+    const configStore = createStore(
+      rootReducer,
+      <any>persistedState,
+      applyMiddleware(epicMiddleware)
+    );
+
+    epicMiddleware.run(rootEpics.createEpics());
+    store.provideStore(configStore);
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/store/reducers.ts b/vid-webpack-master/src/app/shared/store/reducers.ts
new file mode 100644 (file)
index 0000000..90cdd27
--- /dev/null
@@ -0,0 +1,16 @@
+import {MainReducer, ServiceState} from "../storeUtil/utils/main.reducer";
+import {globalReducer, GlobalState} from "../storeUtil/utils/global/global.reducers";
+import {combineReducers, Reducer} from "redux";
+
+
+export interface AppState {
+  global: GlobalState;
+  service: ServiceState;
+}
+
+const rootReducer: Reducer<AppState> = combineReducers<AppState>({
+  global: globalReducer,
+  service: MainReducer
+});
+
+export default rootReducer;
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.action.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.action.spec.ts
new file mode 100644 (file)
index 0000000..a65249a
--- /dev/null
@@ -0,0 +1,157 @@
+import {
+  GeneralActions, UpdateAicZonesAction,
+  UpdateLcpRegionsAndTenantsAction,
+  UpdateProductFamiliesAction,
+  UpdateSubscribersAction, UpdateUserIdAction
+} from "./general.actions";
+import {SelectOption} from "../../../models/selectOption";
+
+
+describe('general actions', () => {
+  test('#UPDATE_LCP_REGIONS_AND_TENANTS : action', () => {
+    const action: UpdateLcpRegionsAndTenantsAction = <UpdateLcpRegionsAndTenantsAction>{
+      type: GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS,
+      lcpRegionsAndTenants: {
+        "lcpRegionList": [],
+        "lcpRegionsTenantsMap": {}
+      }
+    };
+
+    expect(action.type).toEqual(GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS);
+    expect(action.lcpRegionsAndTenants.lcpRegionList).toEqual([]);
+    expect(action.lcpRegionsAndTenants.lcpRegionsTenantsMap).toEqual({});
+  });
+
+  test('#UPDATE_SUBSCRIBERS : action', () => {
+    const action: UpdateSubscribersAction = <UpdateSubscribersAction>{
+      type: GeneralActions.UPDATE_SUBSCRIBERS,
+      subscribers: [
+        {
+          "id": "ERICA5779-Subscriber-2",
+          "name": "ERICA5779-Subscriber-2",
+          "isPermitted": false
+        },
+        {
+          "id": "ERICA5779-Subscriber-3",
+          "name": "ERICA5779-Subscriber-3",
+          "isPermitted": false
+        },
+        {
+          "id": "ERICA5779-Subscriber-4",
+          "name": "ERICA5779-Subscriber-5",
+          "isPermitted": false
+        },
+        {
+          "id": "ERICA5779-TestSub-PWT-101",
+          "name": "ERICA5779-TestSub-PWT-101",
+          "isPermitted": false
+        },
+        {
+          "id": "ERICA5779-TestSub-PWT-102",
+          "name": "ERICA5779-TestSub-PWT-102",
+          "isPermitted": false
+        },
+        {
+          "id": "ERICA5779-TestSub-PWT-103",
+          "name": "ERICA5779-TestSub-PWT-103",
+          "isPermitted": false
+        },
+        {
+          "id": "31739f3e-526b-11e6-beb8-9e71128cae77",
+          "name": "CRAIG/ROBERTS",
+          "isPermitted": false
+        },
+        {
+          "id": "DHV1707-TestSubscriber-2",
+          "name": "DALE BRIDGES",
+          "isPermitted": false
+        },
+        {
+          "id": "jimmy-example",
+          "name": "JimmyExampleCust-20161102",
+          "isPermitted": false
+        },
+        {
+          "id": "jimmy-example2",
+          "name": "JimmyExampleCust-20161103",
+          "isPermitted": false
+        },
+        {
+          "id": "CAR_2020_ER",
+          "name": "CAR_2020_ER",
+          "isPermitted": true
+        },
+        {
+          "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+          "name": "Emanuel",
+          "isPermitted": false
+        },
+        {
+          "id": "21014aa2-526b-11e6-beb8-9e71128cae77",
+          "name": "JULIO ERICKSON",
+          "isPermitted": false
+        },
+        {
+          "id": "DHV1707-TestSubscriber-1",
+          "name": "LLOYD BRIDGES",
+          "isPermitted": false
+        },
+        {
+          "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "name": "SILVIA ROBBINS",
+          "isPermitted": true
+        }
+      ]
+    };
+
+    expect(action.type).toEqual(GeneralActions.UPDATE_SUBSCRIBERS);
+    expect(action.subscribers).toHaveLength(15);
+  });
+
+  test('#UPDATE_PRODUCT_FAMILIES : action', () => {
+    const action: UpdateProductFamiliesAction = <UpdateProductFamiliesAction>{
+      type: GeneralActions.UPDATE_PRODUCT_FAMILIES,
+      productFamilies: [
+        new SelectOption({
+          id : 'id',
+          name : 'name',
+          isPermitted : false
+        })
+      ]
+    };
+
+    expect(action.type).toEqual(GeneralActions.UPDATE_PRODUCT_FAMILIES);
+    expect(action.productFamilies).toHaveLength(1);
+  });
+
+
+  test('#UpdateAicZonesAction : action', () => {
+    const action: UpdateAicZonesAction = <UpdateAicZonesAction>{
+      type: GeneralActions.UPDATE_AIC_ZONES,
+      aicZones: [
+        new SelectOption({
+          id : 'id',
+          name : 'name',
+          isPermitted : false
+        })
+      ]
+    };
+
+    expect(action.type).toEqual(GeneralActions.UPDATE_AIC_ZONES);
+    expect(action.aicZones).toHaveLength(1);
+  });
+
+  test('#UpdateUserIdAction : action', () => {
+    const action: UpdateUserIdAction = <UpdateUserIdAction>{
+      type: GeneralActions.UPDATE_USER_ID,
+      userId: "userId"
+    };
+
+    expect(action.type).toEqual(GeneralActions.UPDATE_USER_ID);
+    expect(action.userId).toBe("userId");
+  });
+
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.actions.ts
new file mode 100644 (file)
index 0000000..7a10eba
--- /dev/null
@@ -0,0 +1,150 @@
+import {Action, ActionCreator} from "redux";
+import {LcpRegionsAndTenants} from "../../../models/lcpRegionsAndTenants";
+import {SelectOptionInterface} from "../../../models/selectOption";
+import {ServiceType} from "../../../models/serviceType";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+
+export enum GeneralActions {
+  UPDATE_LCP_REGIONS_AND_TENANTS = "UPDATE_LCP_REGIONS_AND_TENANTS",
+  UPDATE_SUBSCRIBERS = "UPDATE_SUBSCRIBERS",
+  UPDATE_PRODUCT_FAMILIES = "UPDATE_PRODUCT_FAMILIES",
+  UPDATE_SERVICE_TYPES = "UPDATE_SERVICE_TYPES",
+  UPDATE_AIC_ZONES = "UPDATE_AIC_ZONES",
+  UPDATE_USER_ID = "UPDATE_USER_ID",
+  UPDATE_NETWORK_FUNCTION = "UPDATE_NETWORK_FUNCTION",
+  UPDATE_CATEGORY_PARAMETERS = "UPDATE_CATEGORY_PARAMETERS",
+  REMOVE_INSTANCE = 'REMOVE_INSTANCE',
+  CHANGE_INSTANCE_COUNTER = 'CHANGE_INSTANCE_COUNTER',
+  DUPLICATE_BULK_INSTANCES = 'DUPLICATE_BULK_INSTANCES'
+}
+export interface UpdateLcpRegionsAndTenantsAction extends Action {
+  lcpRegionsAndTenants?: LcpRegionsAndTenants;
+}
+
+export interface RemoveInstanceAction extends Action {
+  modelName?: string;
+  serviceModelId: string;
+  storeKey : string;
+  node : ITreeNode;
+}
+
+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 UpdateUserIdAction extends Action {
+  userId: string;
+}
+
+export interface UpdateNetworkCollectionFunction extends Action {
+  networksAccordingToNetworkCollection: any;
+  network_function: any;
+}
+
+export interface UpdateCategoryParametersAction extends Action {
+  categoryParameters?: Object;
+}
+
+export interface ChangeInstanceCounterAction extends Action{
+  serviceUUID : string;
+  UUID : string;
+  changeBy : number;
+  node : ITreeNode;
+}
+
+export interface DuplicateBulkInstancesAction extends Action {
+  serviceId?: string;
+  modelName?: string;
+  originalName? : string;
+  objects? : {};
+  existingNames: {[key: string] : any};
+  node : ITreeNode;
+}
+
+export interface UpdateServiceTypesAction extends Action {
+  serviceTypes?: ServiceType[];
+  subscriberId: string;
+}
+
+export const updateLcpRegionsAndTenants: ActionCreator<UpdateLcpRegionsAndTenantsAction> = lcpRegionsAndTenants => ({
+  type: GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS,
+  lcpRegionsAndTenants: lcpRegionsAndTenants
+});
+
+export const updateSubscribers: ActionCreator<UpdateSubscribersAction> = subscribers => ({
+  type: GeneralActions.UPDATE_SUBSCRIBERS,
+  subscribers: subscribers
+});
+
+export const updateProductFamilies: ActionCreator<UpdateProductFamiliesAction> = productFamilies => ({
+  type: GeneralActions.UPDATE_PRODUCT_FAMILIES,
+  productFamilies: productFamilies
+});
+
+export const updateAicZones: ActionCreator<UpdateAicZonesAction> = aicZones => ({
+  type: GeneralActions.UPDATE_AIC_ZONES,
+  aicZones: aicZones
+});
+
+export const updateUserId: ActionCreator<UpdateUserIdAction> = userId => ({
+  type: GeneralActions.UPDATE_USER_ID,
+  userId: userId
+});
+
+export const updateNetworkCollectionFunction: ActionCreator<UpdateNetworkCollectionFunction> = (ncf, networksAccordingToNetworkCollection) => ({
+  type: GeneralActions.UPDATE_NETWORK_FUNCTION,
+  networksAccordingToNetworkCollection: networksAccordingToNetworkCollection["results"],
+  network_function: ncf
+});
+
+export const updateCategoryParameters: ActionCreator<UpdateCategoryParametersAction> = categoryParameters => ({
+  type: GeneralActions.UPDATE_CATEGORY_PARAMETERS,
+  categoryParameters: categoryParameters
+});
+
+export const removeInstance: ActionCreator<RemoveInstanceAction> = (modelName, serviceModelId, storeKey, node : ITreeNode) => ({
+  type: GeneralActions.REMOVE_INSTANCE,
+  modelName: modelName,
+  serviceModelId: serviceModelId,
+  storeKey: storeKey,
+  node : node
+});
+
+
+export const changeInstanceCounter: ActionCreator<ChangeInstanceCounterAction> = (UUID, serviceUUID , changeBy, node) => ({
+  type: GeneralActions.CHANGE_INSTANCE_COUNTER,
+  UUID: UUID,
+  serviceUUID: serviceUUID,
+  changeBy : changeBy || 1,
+  node : node
+});
+
+
+export const duplicateBulkInstances: ActionCreator<DuplicateBulkInstancesAction> = (serviceId, objects, existingNames, node) => ({
+  type: GeneralActions.DUPLICATE_BULK_INSTANCES,
+  serviceId: serviceId,
+  objects : objects,
+  existingNames: existingNames,
+  node : node
+});
+
+
+export const updateServiceTypes: ActionCreator<UpdateServiceTypesAction> = (serviceTypes, subscriberId) => ({
+  type: GeneralActions.UPDATE_SERVICE_TYPES,
+  serviceTypes: serviceTypes,
+  subscriberId: subscriberId
+});
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.spec.ts
new file mode 100644 (file)
index 0000000..ed45631
--- /dev/null
@@ -0,0 +1,376 @@
+import {LcpRegion} from "../../../models/lcpRegion";
+import {Tenant} from "../../../models/tenant";
+import {generalReducer} from "./general.reducers";
+import {
+  ChangeInstanceCounterAction,
+  RemoveInstanceAction,
+  DuplicateBulkInstancesAction,
+  GeneralActions,
+  UpdateAicZonesAction,
+  UpdateCategoryParametersAction,
+  UpdateProductFamiliesAction,
+  UpdateServiceTypesAction,
+  UpdateSubscribersAction,
+  UpdateUserIdAction, UpdateNetworkCollectionFunction,
+} from "./general.actions";
+import {SelectOption} from "../../../models/selectOption";
+import {ServiceType} from "../../../models/serviceType";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {VnfInstance} from "../../../models/vnfInstance";
+
+describe('generalReducer', () => {
+  test('#UPDATE_LCP_REGIONS_AND_TENANTS : should update lcp region and tenants', () => {
+    let lcpRegionsAndTenantsObj = [
+      {
+        lcpRegionList : [
+          new LcpRegion(
+            'cloudRegionID',
+            'cloudRegionID (cloudOwner)',
+            true,
+            'cloudOwner'
+          )
+        ],
+        lcpRegionsTenantsMap : {
+          "lcpRegion" : [new Tenant({
+            "tenantID" : "tenantID",
+            "tenantName" : "tenantName",
+            "is-permitted" : true
+          })]
+        }
+      }
+    ];
+    let lcpRegionsAndTenantsState = generalReducer(<any>{serviceInstance : {}},
+      <any>{
+        type: GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS,
+        lcpRegionsAndTenants : lcpRegionsAndTenantsObj
+      })['lcpRegionsAndTenants'];
+
+    expect(lcpRegionsAndTenantsState).toBeDefined();
+  });
+
+  test('#UPDATE_SUBSCRIBERS : should update subscribers', () => {
+    let subscribersList = [
+      new SelectOption({
+        id : 'id',
+        name : 'name',
+        isPermitted : false
+      })
+    ];
+    let subscribersState = generalReducer(<any>
+        {
+          serviceInstance : {}
+        },
+      <UpdateSubscribersAction>{
+        type: GeneralActions.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);
+  });
+
+  test('#UPDATE_PRODUCT_FAMILIES : should update product families', () => {
+    let productFamiliesObj = [
+      new SelectOption({
+        id : 'id',
+        name : 'name',
+        isPermitted : false
+      })
+    ];
+    let productFamiliesState = generalReducer(<any>{serviceInstance : {}},
+      <UpdateProductFamiliesAction>{
+        type: GeneralActions.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);
+  });
+
+  test('#UPDATE_AIC_ZONES : should update aic zones', () => {
+    let aicZonesObj = [
+      new SelectOption({
+        id : 'id',
+        name : 'name',
+        isPermitted : false
+      })
+    ];
+    let aicZonesState = generalReducer(<any>{serviceInstance : {}},
+      <UpdateAicZonesAction>{
+        type: GeneralActions.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);
+  });
+
+  test('#UPDATE_SERVICE_TYPES : should update service types', () => {
+    const subscriberId = 'subscriberId';
+    let serviceTypesList : ServiceType[] = [
+      new ServiceType('id',{
+        'service-type' : 'name',
+        'is-permitted' : true
+      })
+    ];
+    let serviceTypesState = generalReducer(<any>
+        {
+          serviceTypes : {
+          }
+        },
+      <UpdateServiceTypesAction>{
+        type: GeneralActions.UPDATE_SERVICE_TYPES,
+        subscriberId : subscriberId,
+        serviceTypes : serviceTypesList
+      })['serviceTypes'][subscriberId];
+
+    expect(serviceTypesState).toBeDefined();
+    expect(serviceTypesState[0].id).toEqual(serviceTypesList[0].id);
+    expect(serviceTypesState[0].isPermitted).toEqual(serviceTypesList[0].isPermitted);
+    expect(serviceTypesState[0].name).toEqual(serviceTypesList[0].name);
+  });
+
+  test('#UPDATE_CATEGORY_PARAMETERS : should update category parameters', () => {
+    let list = [
+      new SelectOption({
+        id : 'id',
+        name : 'name',
+        isPermitted : false
+      })
+    ];
+
+    const categoryParametersObj = {
+      owningEntityList : list,
+      projectList : list,
+      lineOfBusinessList : list,
+      platformList : list
+    };
+
+    let categoryParametersState = generalReducer(<any>{serviceInstance : {}},
+      <UpdateCategoryParametersAction>{
+        type: GeneralActions.UPDATE_CATEGORY_PARAMETERS,
+        categoryParameters : categoryParametersObj
+      })['categoryParameters'];
+
+    expect(categoryParametersState).toBeDefined();
+    expect(categoryParametersState['owningEntityList'][0].id).toEqual(list[0].id);
+    expect(categoryParametersState['owningEntityList'][0].isPermitted).toEqual(list[0].isPermitted);
+    expect(categoryParametersState['owningEntityList'][0].name).toEqual(list[0].name);
+
+    expect(categoryParametersState['projectList'][0].id).toEqual(list[0].id);
+    expect(categoryParametersState['projectList'][0].isPermitted).toEqual(list[0].isPermitted);
+    expect(categoryParametersState['projectList'][0].name).toEqual(list[0].name);
+
+    expect(categoryParametersState['lineOfBusinessList'][0].id).toEqual(list[0].id);
+    expect(categoryParametersState['lineOfBusinessList'][0].isPermitted).toEqual(list[0].isPermitted);
+    expect(categoryParametersState['lineOfBusinessList'][0].name).toEqual(list[0].name);
+
+    expect(categoryParametersState['platformList'][0].id).toEqual(list[0].id);
+    expect(categoryParametersState['platformList'][0].isPermitted).toEqual(list[0].isPermitted);
+    expect(categoryParametersState['platformList'][0].name).toEqual(list[0].name);
+  });
+
+  test('#UPDATE_USER_ID : should update user id', () => {
+    const userId = 'userId';
+    let userState = generalReducer(<any>{serviceInstance : {}},
+      <UpdateUserIdAction>{
+        type: GeneralActions.UPDATE_USER_ID,
+        userId : userId
+      })['userId'];
+
+    expect(userState).toBeDefined();
+    expect(userState).toEqual(userId);
+  });
+
+  test('#DELETE_VNF_INSTANCE : should delete existing vnf', () => {
+    let state = generalReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'modelName' : {}
+            }
+          }
+        }},
+      <RemoveInstanceAction>{
+        type: GeneralActions.REMOVE_INSTANCE,
+        modelName : 'modelName',
+        serviceModelId : 'serviceModelId',
+        storeKey : 'modelName',
+        node : {
+          data : {
+            type : 'VF'
+          }
+        }
+      });
+
+    expect(state).toBeDefined();
+    expect(state.serviceInstance[ 'serviceModelId'].vnfs['modelName']).not.toBeDefined();
+  });
+
+  test('#DELETE_VNF_INSTANCE : should delete existing network', () => {
+    let state = generalReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            'networks' : {
+              'modelName' : {}
+            }
+          }
+        }},
+      <RemoveInstanceAction>{
+        type: GeneralActions.REMOVE_INSTANCE,
+        modelName : 'modelName',
+        serviceModelId : 'serviceModelId',
+        storeKey : 'modelName',
+        node : {
+          data : {
+            type : 'VL'
+          }
+        }
+      });
+
+    expect(state).toBeDefined();
+    expect(state.serviceInstance['serviceModelId'].networks['modelName']).not.toBeDefined();
+  });
+
+  test('#CHANGE_VNF_INSTANCE_COUNTER : should init existingVNFCounterMap to 1', () => {
+    let state = generalReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vnfName' : { }
+            },
+            existingVNFCounterMap : {
+
+            }
+          }
+        }},
+      <ChangeInstanceCounterAction>{
+        type: GeneralActions.CHANGE_INSTANCE_COUNTER,
+        serviceUUID : 'serviceModelId',
+        node : {data : {type : 'VF'}},
+        UUID : 'vnfUUID',
+        changeBy : 1
+      });
+
+    expect(state).toBeDefined();
+    expect(state.serviceInstance['serviceModelId'].existingVNFCounterMap['vnfUUID']).toEqual(1);
+  });
+
+  test('#CHANGE_VNF_INSTANCE_COUNTER : should increase existingVNFCounterMap to 2 if VNF exist', () => {
+    let state = generalReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vnfName' : { }
+            },
+            existingVNFCounterMap : {
+              'vnfUUID' : 1
+            }
+          }
+        }},
+      <ChangeInstanceCounterAction>{
+        type: GeneralActions.CHANGE_INSTANCE_COUNTER,
+        serviceUUID : 'serviceModelId',
+        UUID : 'vnfUUID',
+        node : {data : {type : 'VF'}},
+        changeBy : 1
+      });
+
+    expect(state).toBeDefined();
+    expect(state.serviceInstance['serviceModelId'].existingVNFCounterMap['vnfUUID']).toEqual(2);
+  });
+
+  test('#CHANGE_VNF_INSTANCE_COUNTER : should remove existingVNFCounterMap to 0 remove VNF', () => {
+
+    let state = generalReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vnfName' : { }
+            },
+            existingVNFCounterMap : {
+              'vnfUUID' : 1
+            }
+          }
+        }},
+      <ChangeInstanceCounterAction>{
+        type: GeneralActions.CHANGE_INSTANCE_COUNTER,
+        serviceUUID : 'serviceModelId',
+        UUID : 'vnfUUID',
+        node : {data : {type : 'VF'}},
+        changeBy : -1
+      });
+
+    expect(state).toBeDefined();
+    expect(state.serviceInstance['serviceModelId'].existingVNFCounterMap['vnfUUID']).toEqual(0);
+  });
+
+  test('#DUPLICATE_BULK_INSTANCES : should duplicate existing VNF/Network', ()=>{
+    let existingNames = {
+      'vnfOriginalName' : 1
+    };
+
+    let vnfInstance: VnfInstance = new VnfInstance();
+    vnfInstance.originalName = 'vnfOriginalName';
+    vnfInstance.vnfStoreKey = 'vnfStoreKey';
+
+    let cloneObjects = {
+      'vnfOriginalName' : vnfInstance,
+      'vnfOriginalName:0001' : vnfInstance,
+      'vnfOriginalName:0002' : vnfInstance,
+      'vnfOriginalName:0003' : vnfInstance
+    };
+
+    let node : ITreeNode = <any>{
+      data : {
+        serviceId : 'serviceModelId',
+        vnfStoreKey : 'vnfStoreKey',
+        type : 'VF'
+      }
+    };
+
+    let vnfsState = generalReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+            },
+            existingVNFCounterMap : {}
+          }
+        }},
+      <DuplicateBulkInstancesAction>{
+        type: GeneralActions.DUPLICATE_BULK_INSTANCES,
+        serviceId: 'serviceModelId',
+        modelName: 'modelName',
+        originalName : 'modelName',
+        objects : cloneObjects,
+        existingNames: existingNames,
+        node : node
+      }).serviceInstance['serviceModelId'].vnfs;
+
+    expect(vnfsState).toBeDefined();
+    expect(Object.keys(vnfsState).length).toEqual(4);
+  });
+
+  test('#UPDATE_NETWORK_FUNCTION : should update network functions', ()=>{
+    let state = generalReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+            },
+            existingVNFCounterMap : {}
+          }
+        }},
+      <UpdateNetworkCollectionFunction>{
+        type: GeneralActions.UPDATE_NETWORK_FUNCTION,
+        network_function : {
+          results : []
+        },
+        networksAccordingToNetworkCollection : "networksAccordingToNetworkCollection"
+      });
+
+    expect(state).toBeDefined();
+    expect(state['networkFunctions']).toBeDefined();
+  });
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/general/general.reducers.ts
new file mode 100644 (file)
index 0000000..8ee4733
--- /dev/null
@@ -0,0 +1,147 @@
+import {Action} from "redux";
+import {
+  ChangeInstanceCounterAction, RemoveInstanceAction, DuplicateBulkInstancesAction,
+  GeneralActions,
+  UpdateAicZonesAction, UpdateCategoryParametersAction,
+  UpdateLcpRegionsAndTenantsAction, UpdateNetworkCollectionFunction,
+  UpdateProductFamiliesAction, UpdateServiceTypesAction,
+  UpdateSubscribersAction, UpdateUserIdAction
+} from "./general.actions";
+import {TypeNodeInformation} from "../../../../drawingBoard/service-planning/typeNodeInformation.model";
+import * as _ from "lodash";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {ServiceState} from "../main.reducer";
+
+export function generalReducer(state: ServiceState, action: Action) : ServiceState {
+  switch (action.type) {
+    case GeneralActions.UPDATE_LCP_REGIONS_AND_TENANTS: {
+      Object.assign(state, (<UpdateLcpRegionsAndTenantsAction>action));
+      return Object.assign({}, state);
+    }
+    case GeneralActions.UPDATE_SUBSCRIBERS: {
+      Object.assign(state, (<UpdateSubscribersAction>action));
+      return Object.assign({}, state);
+    }
+    case GeneralActions.UPDATE_AIC_ZONES: {
+      Object.assign(state, (<UpdateAicZonesAction>action));
+      return Object.assign({}, state);
+    }
+    case GeneralActions.UPDATE_PRODUCT_FAMILIES: {
+      Object.assign(state, (<UpdateProductFamiliesAction>action));
+      return Object.assign({}, state);
+    }
+    case GeneralActions.UPDATE_NETWORK_FUNCTION: {
+      const networkFunctionReduxObj = state['networkFunctions'] == undefined ? {} : state['networkFunctions'];
+      networkFunctionReduxObj[(<UpdateNetworkCollectionFunction>action).network_function] = (<UpdateNetworkCollectionFunction>action).networksAccordingToNetworkCollection;
+      Object.assign(state, {'networkFunctions': networkFunctionReduxObj});
+      return Object.assign({}, state);
+    }
+    case GeneralActions.UPDATE_SERVICE_TYPES: {
+      state.serviceTypes[(<UpdateServiceTypesAction>action).subscriberId] = (<UpdateServiceTypesAction>action).serviceTypes;
+      return Object.assign({}, state);
+    }
+    case GeneralActions.UPDATE_CATEGORY_PARAMETERS: {
+      Object.assign(state, (<UpdateCategoryParametersAction>action));
+      return Object.assign({}, state);
+    }
+    case GeneralActions.UPDATE_USER_ID: {
+      const updateUserId: UpdateUserIdAction = <UpdateUserIdAction>action;
+      let newState = _.cloneDeep(state);
+      newState['userId'] = updateUserId.userId;
+      return newState;
+    }
+    case GeneralActions.REMOVE_INSTANCE: {
+      const actionData = (<RemoveInstanceAction>action);
+      if (state.serviceInstance[actionData.serviceModelId]) {
+        const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(actionData.node);
+        updateIsMissingDataOnDelete(state, actionData.serviceModelId, actionData.storeKey, actionData.node);
+        updateUniqueNames(state.serviceInstance[actionData.serviceModelId][typeNodeInformation.hierarchyName][actionData.storeKey].instanceName, null, state.serviceInstance[actionData.serviceModelId]);
+        if(actionData.node.data.type === 'VF'){
+          _.forOwn(state.serviceInstance[actionData.serviceModelId][typeNodeInformation.hierarchyName][actionData.storeKey].vfModules, (vfModuleMap) => {
+            _.forOwn(vfModuleMap, (vfModuleInstance) => {
+              updateUniqueNames(vfModuleInstance.instanceName, null, state.serviceInstance[actionData.serviceModelId]);
+            })
+          });
+        }
+        delete state.serviceInstance[actionData.serviceModelId][typeNodeInformation.hierarchyName][actionData.storeKey];
+      }
+      return Object.assign({}, state);
+    }
+
+    case GeneralActions.CHANGE_INSTANCE_COUNTER : {
+      const changeInstanceCounterAction = <ChangeInstanceCounterAction>action;
+      const typeNodeInformation : TypeNodeInformation =  new TypeNodeInformation(changeInstanceCounterAction.node);
+      let newState = _.cloneDeep(state);
+
+      let existing: number = getExistingCounter(newState, changeInstanceCounterAction.serviceUUID, changeInstanceCounterAction.UUID, typeNodeInformation);
+      newState.serviceInstance[changeInstanceCounterAction.serviceUUID][typeNodeInformation.existingMappingCounterName][changeInstanceCounterAction.UUID] = existing ? existing + changeInstanceCounterAction.changeBy : changeInstanceCounterAction.changeBy;
+      return newState;
+    }
+
+    case GeneralActions.DUPLICATE_BULK_INSTANCES : {
+      const createInstanceAction = <DuplicateBulkInstancesAction>action;
+      const typeNodeInformation : TypeNodeInformation =  new TypeNodeInformation(createInstanceAction.node);
+      const serviceId = createInstanceAction.serviceId;
+      const objects = createInstanceAction.objects;
+
+      let newState = _.cloneDeep(state);
+      newState.serviceInstance[serviceId].existingNames = createInstanceAction.existingNames;
+      newState.serviceInstance[serviceId][typeNodeInformation.hierarchyName] = Object.assign({}, newState.serviceInstance[serviceId][typeNodeInformation.hierarchyName], objects);
+      return newState;
+    }
+  }
+}
+
+const getExistingCounter = (state: any, serviceModelId: string, modelId: string, typeNodeInformation : TypeNodeInformation ) : number => {
+  const serviceExistingCounterMap = state.serviceInstance[serviceModelId][typeNodeInformation.existingMappingCounterName];
+  if(serviceExistingCounterMap && !_.isNil(serviceExistingCounterMap[modelId])){
+    return serviceExistingCounterMap[modelId];
+  }else {
+    return null;
+  }
+};
+
+const updateIsMissingDataOnDelete = (state: any, serviceModelId: string, storeKey: string, node: ITreeNode): void => {
+  const typeNodeInformation : TypeNodeInformation = new TypeNodeInformation(node);
+  let vnf = state.serviceInstance[serviceModelId][typeNodeInformation.hierarchyName][storeKey];
+  if(node.children){
+    _.forOwn(vnf.vfModules, (vfModules, vfModulesKey) => {
+      updateIsMissingDataOnDeleteVFModule(state, serviceModelId, storeKey, vfModulesKey);
+    });
+  }
+
+
+  let isMissingData: boolean = state.serviceInstance[serviceModelId][typeNodeInformation.hierarchyName][storeKey].isMissingData;
+  updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
+};
+
+const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
+  let existingNames = serviceInstance.existingNames;
+  if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+    delete existingNames[oldName.toLowerCase()];
+  }
+  if(!_.isNil(newName)) {
+    existingNames[newName.toLowerCase()] = "";
+  }
+};
+
+const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => {
+  const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName];
+
+  _.forOwn(vfModules, (vfModuleInstance) => {
+    let isMissingData: boolean = vfModuleInstance.isMissingData;
+    updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
+  });
+};
+
+const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
+  if (oldValidationState && !newValidationState) {
+    newState.serviceInstance[serviceUuid].validationCounter--;
+  } else if (!oldValidationState && newValidationState) {
+    newState.serviceInstance[serviceUuid].validationCounter++;
+  }
+};
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.actions.ts
new file mode 100644 (file)
index 0000000..609ec69
--- /dev/null
@@ -0,0 +1,37 @@
+import {Action, ActionCreator} from "redux";
+
+export enum GlobalActions {
+  UPDATE_NAME = 'UPDATE_NAME',
+  UPDATE_FLAGS = 'UPDATE_FLAGS',
+  UPDATE_DRAWING_BOARD_STATUS = 'UPDATE_DRAWING_BOARD_STATUS'
+}
+
+export interface UpdateGlobalAction extends Action {
+  name?: string;
+}
+
+export interface UpdateFlagsAction extends Action {
+  flags?: any;
+}
+
+export interface UpdateDrawingBoardStatusAction extends Action{
+  drawingBoardStatus?: any;
+}
+
+export const updateName: ActionCreator<UpdateGlobalAction> =
+  (name) => ({
+    type: GlobalActions.UPDATE_NAME,
+    name: name
+  });
+
+export const updateFlags: ActionCreator<UpdateFlagsAction> =
+  (flags) => ({
+    type: GlobalActions.UPDATE_FLAGS,
+    flags: flags
+  });
+
+export const updateDrawingBoardStatus: ActionCreator<UpdateDrawingBoardStatusAction> =
+  (drawingBoardStatus) => ({
+    type: GlobalActions.UPDATE_DRAWING_BOARD_STATUS,
+    drawingBoardStatus: drawingBoardStatus
+  });
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/global/global.reducers.spec.ts
new file mode 100644 (file)
index 0000000..4fc8086
--- /dev/null
@@ -0,0 +1,48 @@
+import {GlobalActions, UpdateFlagsAction, UpdateGlobalAction, UpdateDrawingBoardStatusAction} from "./global.actions";
+import {globalReducer} from "./global.reducers";
+
+
+describe('globalReducer', () => {
+
+  test('#UPDATE_FLAGS : should update global flags', () => {
+    const flags = {
+      'A' : 'A',
+      'B' : 'B',
+      'C' : 'C',
+      'D' : 'D'
+    };
+    let flagsState = globalReducer(<any>{global : {}},
+      <UpdateFlagsAction>{
+        type: GlobalActions.UPDATE_FLAGS,
+        flags : flags
+      }).flags;
+
+    expect(flagsState).toBeDefined();
+    expect(<any>flagsState).toEqual(<any>flags);
+  });
+
+  test('#UPDATE_NAME : should update global name', () => {
+    const name = 'name';
+    let globalState = globalReducer(<any>{global : {}},
+      <UpdateGlobalAction>{
+        type: GlobalActions.UPDATE_NAME,
+        name : name
+      });
+    expect(globalState).toBeDefined();
+    expect(globalState.name).toEqual(name);
+  });
+
+  test('#UPDATE_DRAWING_BOARD_STATUS : should update global drawing board status',  ()=> {
+    const drawingBoardStatus = 'EDIT';
+    let globalDrawingBoardState = globalReducer(<any>{global : {}},
+      <UpdateDrawingBoardStatusAction>{
+        type: GlobalActions.UPDATE_DRAWING_BOARD_STATUS,
+        drawingBoardStatus : drawingBoardStatus
+      });
+    expect(globalDrawingBoardState).toBeDefined();
+    expect(globalDrawingBoardState.drawingBoardStatus).toEqual(drawingBoardStatus);
+  });
+});
+
+
+
@@ -1,28 +1,28 @@
-/* tslint:disable no-switch-case-fall-through */
 import {Action} from 'redux';
-import {UPDATE_FLAGS, UPDATE_NAME, UpdateFlagsAction, UpdateGlobalAction} from "./global.actions";
-
-
+import {GlobalActions, UpdateFlagsAction, UpdateGlobalAction, UpdateDrawingBoardStatusAction} from "./global.actions";
 
 export interface GlobalState {
   name : string;
   flags : { [key: string]: boolean };
+  drawingBoardStatus : string;
 }
 
 const initialState: GlobalState = {
   name : null,
-  flags : null
+  flags : null,
+  drawingBoardStatus : null
 };
 
-
-export const GlobalReducer =
+export const globalReducer =
   function (state: GlobalState = initialState, action: Action): GlobalState {
     switch (action.type) {
-      case UPDATE_NAME:
+      case GlobalActions.UPDATE_NAME:
         return Object.assign(state, state, (<UpdateGlobalAction>action));
-      case UPDATE_FLAGS:
+      case GlobalActions.UPDATE_FLAGS:
         Object.assign(state, (<UpdateFlagsAction>action));
         return Object.assign({}, state);
+      case GlobalActions.UPDATE_DRAWING_BOARD_STATUS:
+        return Object.assign(state, state, (<UpdateDrawingBoardStatusAction>action));
       default:
         return state;
     }
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/main.reducer.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/main.reducer.ts
new file mode 100644 (file)
index 0000000..2166c81
--- /dev/null
@@ -0,0 +1,67 @@
+import {LcpRegionsAndTenants} from "../../models/lcpRegionsAndTenants";
+import {CategoryParams} from "../../models/categoryParams";
+import {Action} from "redux";
+import {ServiceActions} from "./service/service.actions";
+import {GeneralActions} from "./general/general.actions";
+import {NetworkActions} from "./network/network.actions";
+import {VfModuleActions} from "./vfModule/vfModule.actions";
+import {VNFActions} from "./vnf/vnf.actions";
+import {vnfReducer} from "./vnf/vnf.reducers";
+import {generalReducer} from "./general/general.reducers";
+import {serviceReducer} from "./service/service.reducers";
+import {networkReducer} from "./network/network.reducers";
+import {vfModuleReducer} from "./vfModule/vfModule.reducers";
+import {ServiceInstance} from "../../models/serviceInstance";
+import {SelectOptionInterface} from "../../models/selectOption";
+import {ServiceType} from "../../models/serviceType";
+import {VnfGroupActions} from "./vnfGroup/vnfGroup.actions";
+import {vnfGroupReducer} from "./vnfGroup/vnfGroup.reducers";
+import {RelatedVnfActions} from "./relatedVnfMember/relatedVnfMember.actions";
+import {relatedVnfMemeberReducer} from "./relatedVnfMember/relatedVnfMember.reducers";
+
+export let initialState: ServiceState = {
+  serviceHierarchy: {},
+  serviceInstance: {},
+  lcpRegionsAndTenants: new LcpRegionsAndTenants(),
+  subscribers: null,
+  productFamilies: null,
+  serviceTypes: {},
+  aicZones: null,
+  categoryParameters: new CategoryParams()
+};
+
+
+export interface ServiceState {
+  serviceHierarchy: any;
+  serviceInstance: { [uuid: string]: ServiceInstance; };
+  lcpRegionsAndTenants: LcpRegionsAndTenants;
+  subscribers: SelectOptionInterface[];
+  productFamilies: any;
+  serviceTypes: { [subscriberId: string]: ServiceType[]; };
+  aicZones: SelectOptionInterface[];
+  categoryParameters: CategoryParams;
+}
+
+export const MainReducer = function (state: ServiceState = initialState, action: Action): ServiceState {
+  console.info("action name", action.type);
+  if(Object.values(ServiceActions).includes(action.type)){
+    return serviceReducer(state, action);
+  }else if (Object.values(GeneralActions).includes(action.type)){
+    return generalReducer(state, action);
+  }else if (Object.values(NetworkActions).includes(action.type)){
+    return networkReducer(state, action);
+  }else if (Object.values(VfModuleActions).includes(action.type)){
+    return vfModuleReducer(state, action);
+  }else if (Object.values(VNFActions).includes(action.type)){
+    return vnfReducer(state, action);
+  }else if (Object.values(VnfGroupActions).includes(action.type)){
+    return vnfGroupReducer(state, action);
+  }else if(Object.values(RelatedVnfActions).includes(action.type)){
+    return relatedVnfMemeberReducer(state, action);
+  } else {
+    return Object.assign({}, state);
+  }
+};
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.actions.ts
new file mode 100644 (file)
index 0000000..c90d8eb
--- /dev/null
@@ -0,0 +1,94 @@
+import {Action, ActionCreator} from "redux";
+import {NetworkInstance} from "../../../models/networkInstance";
+
+export enum NetworkActions {
+  UPDATE_NETWORK_INSTANCE = "UPDATE_NETWORK_INSTANCE",
+  UPDATE_NETWORK_FUNCTION  = 'UPDATE_NETWORK_FUNCTION',
+  CREATE_NETWORK_INSTANCE = 'CREATE_NETWORK_INSTANCE',
+  DELETE_ACTION_NETWORK_INSTANCE = "DELETE_ACTION_NETWORK_INSTANCE",
+  UNDO_DELETE_ACTION_NETWORK_INSTANCE = "UNDO_DELETE_ACTION_NETWORK_INSTANCE",
+  UPDATE_NETWORK_POSITION = "UPDATE_NETWORK_POSITION"
+
+}
+
+
+export interface UpdateNetworkPosition extends Action {
+  node: any,
+  instanceId : string,
+  networkStoreKey?: string;
+}
+
+export interface UpdateNetworkInstanceAction extends Action {
+  networkInstance?: NetworkInstance;
+  networkModelName?: string;
+  serviceUuid?: string;
+  networkStoreKey?:string;
+}
+
+export interface UpdateNetworkCollectionFunction extends Action {
+  networksAccordingToNetworkCollection: any;
+  network_function: any;
+}
+
+export interface CreateNetworkInstanceAction extends Action {
+  networkInstance?: NetworkInstance;
+  networkModelName?: string;
+  serviceUuid?: string;
+  networkStoreKey?:string;
+}
+
+export interface DeleteActionNetworkInstanceAction extends Action {
+  networkStoreKey: string;
+  serviceId?: string;
+}
+
+export interface UndoDeleteActionNetworkInstanceAction extends Action {
+  networkStoreKey: string;
+  serviceId?: string;
+}
+
+export const updateNetworkInstance: ActionCreator<UpdateNetworkInstanceAction> = (networkInstance, networkfModelName, serviceUuid, networkStoreKey) => ({
+  type: NetworkActions.UPDATE_NETWORK_INSTANCE,
+  networkInstance: networkInstance,
+  networkModelName: networkfModelName,
+  serviceUuid: serviceUuid,
+  networkStoreKey : networkStoreKey
+});
+
+
+export const updateNetworkCollectionFunction: ActionCreator<UpdateNetworkCollectionFunction> = (ncf, networksAccordingToNetworkCollection) => ({
+  type: NetworkActions.UPDATE_NETWORK_FUNCTION,
+  networksAccordingToNetworkCollection: networksAccordingToNetworkCollection["results"],
+  network_function: ncf
+});
+
+export const createNetworkInstance: ActionCreator<CreateNetworkInstanceAction> = (networkInstance, networkModelName, serviceUuid, networkStoreKey) => ({
+  type: NetworkActions.CREATE_NETWORK_INSTANCE,
+  networkInstance: networkInstance,
+  networkModelName: networkModelName,
+  serviceUuid: serviceUuid,
+  networkStoreKey : networkStoreKey
+});
+
+
+export const deleteActionNetworkInstance: ActionCreator<DeleteActionNetworkInstanceAction> = (networkStoreKey, serviceId) => ({
+  type: NetworkActions.DELETE_ACTION_NETWORK_INSTANCE,
+  networkStoreKey: networkStoreKey,
+  serviceId: serviceId
+});
+
+export const undoDeleteActionNetworkInstance: ActionCreator<UndoDeleteActionNetworkInstanceAction> = (networkStoreKey, serviceId) => ({
+  type: NetworkActions.UNDO_DELETE_ACTION_NETWORK_INSTANCE,
+  networkStoreKey: networkStoreKey,
+  serviceId: serviceId
+});
+
+
+export const updateNetworkPosition: ActionCreator<UpdateNetworkPosition> = (node, instanceId, networkStoreKey) => ({
+  type: NetworkActions.UPDATE_NETWORK_POSITION,
+  node: node,
+  instanceId: instanceId,
+  networkStoreKey : networkStoreKey
+});
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.spec.ts
new file mode 100644 (file)
index 0000000..ba41ad6
--- /dev/null
@@ -0,0 +1,114 @@
+import {networkReducer} from "./network.reducers";
+import {
+  CreateNetworkInstanceAction, DeleteActionNetworkInstanceAction,
+  NetworkActions, UndoDeleteActionNetworkInstanceAction,
+  UpdateNetworkCollectionFunction,
+  UpdateNetworkInstanceAction
+} from "./network.actions";
+import {NetworkInstance} from "../../../models/networkInstance";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+
+describe('networkReducer', () => {
+  test('#CREATE_SERVICE_INSTANCE', () => {
+    let networkInstance: NetworkInstance = new NetworkInstance();
+    networkInstance.isMissingData = false;
+    networkInstance.instanceName = 'instanceName';
+    let networkState = networkReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            networks : {
+              'networkStoreKey' : {
+                isMissingData : true
+              }
+            }
+          }
+        }},
+      <UpdateNetworkInstanceAction>{
+        type: NetworkActions.UPDATE_NETWORK_INSTANCE,
+        networkInstance : new NetworkInstance(),
+        networkStoreKey : 'networkStoreKey',
+        networkModelName : 'networkModelName',
+        serviceUuid : 'serviceModelId'
+      }).serviceInstance['serviceModelId'].networks['networkStoreKey'];
+
+    expect(networkState).toBeDefined();
+    expect(networkState.isMissingData).toBeFalsy();
+  });
+
+  test('#CREATE_NETWORK_INSTANCE', () => {
+    let networkInstance: NetworkInstance = new NetworkInstance();
+    networkInstance.isMissingData = false;
+    networkInstance.instanceName = 'instanceName';
+    let networkState = networkReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            networks : {}
+          }
+        }},
+      <CreateNetworkInstanceAction>{
+        type: NetworkActions.CREATE_NETWORK_INSTANCE,
+        networkInstance : new NetworkInstance(),
+        networkStoreKey : null,
+        networkModelName : 'networkModelName',
+        serviceUuid : 'serviceModelId'
+      }).serviceInstance['serviceModelId'].networks['networkModelName'];
+
+    expect(networkState).toBeDefined();
+    expect(networkState.isMissingData).toBeFalsy();
+  });
+
+  test('#UPDATE_NETWORK_FUNCTION', () => {
+    let state = networkReducer(<any>{serviceInstance : {}},
+      <UpdateNetworkCollectionFunction>{
+        type: NetworkActions.UPDATE_NETWORK_FUNCTION,
+        networksAccordingToNetworkCollection: 'networksAccordingToNetworkCollection',
+        network_function: 'network_function'
+      });
+
+    expect(state).toBeDefined();
+  });
+
+  test('#DELETE_ACTION_NETWORK_INSTANCE', () => {
+    let networkState = networkReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            networks : {
+              'networkStoreKey' : {
+                isMissingData : true,
+                action : 'None'
+              }
+            }
+          }
+        }},
+      <DeleteActionNetworkInstanceAction>{
+        type: NetworkActions.DELETE_ACTION_NETWORK_INSTANCE,
+        networkStoreKey: 'networkStoreKey',
+        serviceId: 'serviceModelId'
+      }).serviceInstance['serviceModelId'].networks['networkStoreKey'];
+
+    expect(networkState).toBeDefined();
+    expect(networkState.action).toEqual(ServiceInstanceActions.None_Delete);
+  });
+
+  test('#UNDO_DELETE_ACTION_NETWORK_INSTANCE', () => {
+    let networkState = networkReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            networks : {
+              'networkStoreKey' : {
+                isMissingData : true,
+                action : 'Update_Delete'
+              }
+            }
+          }
+        }},
+      <UndoDeleteActionNetworkInstanceAction>{
+        type: NetworkActions.UNDO_DELETE_ACTION_NETWORK_INSTANCE,
+        networkStoreKey: 'networkStoreKey',
+        serviceId: 'serviceModelId'
+      }).serviceInstance['serviceModelId'].networks['networkStoreKey'];
+
+    expect(networkState).toBeDefined();
+    expect(networkState.action).toEqual(ServiceInstanceActions.Update);
+  });
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/network/network.reducers.ts
new file mode 100644 (file)
index 0000000..bcbbea5
--- /dev/null
@@ -0,0 +1,102 @@
+import {Action} from "redux";
+import * as _ from "lodash";
+import {NetworkInstance} from "../../../models/networkInstance";
+import {
+  CreateNetworkInstanceAction, DeleteActionNetworkInstanceAction,
+  NetworkActions, UndoDeleteActionNetworkInstanceAction,
+  UpdateNetworkCollectionFunction,
+  UpdateNetworkInstanceAction
+} from "./network.actions";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {calculateNextUniqueModelName} from "../vnf/vnf.reducers";
+import {ServiceState} from "../main.reducer";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+
+export function networkReducer(state: ServiceState , action: Action) : ServiceState {
+  switch (action.type) {
+    case NetworkActions.CREATE_NETWORK_INSTANCE: {
+      const updateNetworkInstanceAction = <CreateNetworkInstanceAction>action;
+      const serviceUuid = updateNetworkInstanceAction.serviceUuid;
+      let networkModelName = updateNetworkInstanceAction.networkModelName;
+
+
+      let newState = _.cloneDeep(state);
+
+      updateNetworkInstanceAction.networkInstance.originalName = networkModelName;
+      updateNetworkInstanceAction.networkModelName = calculateNextUniqueModelName(networkModelName, serviceUuid, newState, 'networks');
+
+      let networkInstance: NetworkInstance = newState.serviceInstance[serviceUuid].networks[networkModelName];
+      networkInstance = new NetworkInstance();
+      updateNetworkInstanceAction.networkInstance.networkStoreKey = updateNetworkInstanceAction.networkModelName;
+      updateNetworkInstanceAction.networkInstance.originalName = networkModelName;
+      networkInstance.originalName = updateNetworkInstanceAction.networkInstance.originalName;
+      networkInstance.networkStoreKey = updateNetworkInstanceAction.networkInstance.networkStoreKey;
+      updateServiceValidationCounter(newState, networkInstance['isMissingData'], updateNetworkInstanceAction.networkInstance['isMissingData'], serviceUuid);
+
+      newState.serviceInstance[serviceUuid].networks[updateNetworkInstanceAction.networkModelName] = Object.assign(networkInstance, updateNetworkInstanceAction.networkInstance);
+      return newState;
+    }
+    case NetworkActions.UPDATE_NETWORK_INSTANCE: {
+      const updateNetworkInstanceAction = <UpdateNetworkInstanceAction>action;
+      const serviceUuid = updateNetworkInstanceAction.serviceUuid;
+      let networkStoreKey = updateNetworkInstanceAction.networkStoreKey;
+
+      let newState = _.cloneDeep(state);
+      let networkInstance: NetworkInstance = newState.serviceInstance[serviceUuid].networks[networkStoreKey];
+      updateUniqueNames(networkInstance? networkInstance.instanceName : null, updateNetworkInstanceAction.networkInstance.instanceName, newState.serviceInstance[serviceUuid]);
+
+      networkInstance = networkInstance || new NetworkInstance();
+      updateServiceValidationCounter(newState, networkInstance['isMissingData'], updateNetworkInstanceAction.networkInstance['isMissingData'], serviceUuid);
+
+      newState.serviceInstance[serviceUuid].networks[networkStoreKey] = Object.assign(networkInstance, updateNetworkInstanceAction.networkInstance);
+      return newState;
+    }
+    case NetworkActions.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 NetworkActions.DELETE_ACTION_NETWORK_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let network = newState.serviceInstance[(<DeleteActionNetworkInstanceAction>action).serviceId].networks[(<DeleteActionNetworkInstanceAction>action).networkStoreKey];
+      let oldAction = network.action;
+      if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
+      newState.serviceInstance[(<DeleteActionNetworkInstanceAction>action).serviceId].networks[(<DeleteActionNetworkInstanceAction>action).networkStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
+      updateServiceValidationCounter(newState, network['isMissingData'], false , (<DeleteActionNetworkInstanceAction>action).serviceId);
+
+      return newState;
+    }
+
+    case NetworkActions.UNDO_DELETE_ACTION_NETWORK_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let network = newState.serviceInstance[(<UndoDeleteActionNetworkInstanceAction>action).serviceId].networks[(<UndoDeleteActionNetworkInstanceAction>action).networkStoreKey];
+      let oldState = network.action;
+      newState.serviceInstance[(<UndoDeleteActionNetworkInstanceAction>action).serviceId].networks[(<UndoDeleteActionNetworkInstanceAction>action).networkStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions;
+      updateServiceValidationCounter(newState, network['isMissingData'], false , (<DeleteActionNetworkInstanceAction>action).serviceId);
+      return newState;
+    }
+  }
+}
+
+const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
+  let existingNames = serviceInstance.existingNames;
+  if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+    delete existingNames[oldName.toLowerCase()];
+  }
+  if(!_.isNil(newName)) {
+    existingNames[newName.toLowerCase()] = "";
+  }
+};
+
+
+const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
+  if (oldValidationState && !newValidationState) {
+    newState.serviceInstance[serviceUuid].validationCounter--;
+  } else if (!oldValidationState && newValidationState) {
+    newState.serviceInstance[serviceUuid].validationCounter++;
+  }
+};
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.actions.ts
new file mode 100644 (file)
index 0000000..faa7a52
--- /dev/null
@@ -0,0 +1,68 @@
+import {Action, ActionCreator} from "redux";
+
+export enum RelatedVnfActions {
+  CREATE_RELATED_VNF_MEMBER_INSTANCE = "CREATE_RELATED_VNF_MEMBER_INSTANCE",
+  REMOVE_RELATED_VNF_MEMBER_INSTANCE = "REMOVE_RELATED_VNF_MEMBER_INSTANCE",
+  DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE = "DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE",
+  UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE = "UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE"
+}
+
+export interface RemoveRelatedVnfMemebrInstance extends Action {
+  vnfGroupStoreKey: string;
+  relatedVnfMemeberStoreKey: string;
+  serviceId?: string;
+}
+
+export interface DeleteRelatedVnfMemebrInstanceAction extends Action {
+  vnfGroupStoreKey: string;
+  relatedVnfMemeberStoreKey: string;
+  serviceId?: string;
+}
+
+export interface DeleteActionRelatedVnfMemeberInstanceAction extends Action {
+  vnfGroupStoreKey: string;
+  relatedVnfMemeberStoreKey: string;
+  serviceId?: string;
+}
+
+export interface UndoDeleteActionRelatedVnfMemeberInstanceAction extends Action {
+  vnfGroupStoreKey: string;
+  relatedVnfMemeberStoreKey: string;
+  serviceId?: string;
+}
+
+export interface CreateRelatedVnfMemeberInstanceAction extends Action {
+  relatedVnfMember: any;
+  vnfGroupStoreKey: string;
+  serviceId?: string;
+}
+
+
+export const removeRelatedVnfMemberInstance: ActionCreator<RemoveRelatedVnfMemebrInstance> = (vnfGroupStoreKey, relatedVnfMemeberStoreKey, serviceId) => ({
+  type: RelatedVnfActions.REMOVE_RELATED_VNF_MEMBER_INSTANCE,
+  vnfGroupStoreKey: vnfGroupStoreKey,
+  relatedVnfMemeberStoreKey: relatedVnfMemeberStoreKey,
+  serviceId: serviceId
+});
+
+export const deleteActionRelatedVnfMemberInstance: ActionCreator<DeleteActionRelatedVnfMemeberInstanceAction> = (vnfGroupStoreKey, relatedVnfMemeberStoreKey, serviceId) => ({
+  type: RelatedVnfActions.DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE,
+  vnfGroupStoreKey: vnfGroupStoreKey,
+  relatedVnfMemeberStoreKey: relatedVnfMemeberStoreKey,
+  serviceId: serviceId
+});
+
+export const undoDeleteActionRelatedVnfMemberInstance: ActionCreator<UndoDeleteActionRelatedVnfMemeberInstanceAction> = (vnfGroupStoreKey, relatedVnfMemeberStoreKey, serviceId) => ({
+  type: RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE,
+  vnfGroupStoreKey: vnfGroupStoreKey,
+  relatedVnfMemeberStoreKey: relatedVnfMemeberStoreKey,
+  serviceId: serviceId
+});
+
+
+export const createRelatedVnfMemberInstance: ActionCreator<CreateRelatedVnfMemeberInstanceAction> = (vnfGroupStoreKey, serviceId, relatedVnfMember) => ({
+  type: RelatedVnfActions.CREATE_RELATED_VNF_MEMBER_INSTANCE,
+  relatedVnfMember: relatedVnfMember,
+  vnfGroupStoreKey: vnfGroupStoreKey,
+  serviceId: serviceId
+});
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.spec.ts
new file mode 100644 (file)
index 0000000..3479574
--- /dev/null
@@ -0,0 +1,153 @@
+import {relatedVnfMemeberReducer} from "./relatedVnfMember.reducers";
+import {
+  CreateRelatedVnfMemeberInstanceAction,
+  DeleteActionRelatedVnfMemeberInstanceAction,
+  RelatedVnfActions,
+  UndoDeleteActionRelatedVnfMemeberInstanceAction
+} from "./relatedVnfMember.actions";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+
+describe('relatedVnfMemberReducer', () => {
+
+  test('#DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE should change action to delete',() => {
+    const serviceUuid: string = 'serviceUuid';
+    const actionName: ServiceInstanceActions = ServiceInstanceActions.None;
+
+    let service = relatedVnfMemeberReducer(<any>{
+      serviceInstance: {
+        'serviceUuid': {
+          'vnfGroups' : {
+            'vnfGroupStoreKey' : {
+              'vnfs' : {
+                'vnfStoreKey1' : {
+                  'action' : actionName
+                }
+              }
+            }
+
+          }
+        }
+      }
+    }, <DeleteActionRelatedVnfMemeberInstanceAction>{
+      type: RelatedVnfActions.DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE,
+      vnfGroupStoreKey: 'vnfGroupStoreKey',
+      relatedVnfMemeberStoreKey : 'vnfStoreKey1',
+      serviceId : 'serviceUuid'
+    });
+
+    expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['vnfStoreKey1'].action).toEqual('None_Delete');
+  });
+
+  test('#UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE should undo change action to delete', () => {
+    const serviceUuid: string = 'serviceUuid';
+    const actionName: ServiceInstanceActions = ServiceInstanceActions.None_Delete;
+
+    let service = relatedVnfMemeberReducer(<any>{
+      serviceInstance: {
+        'serviceUuid': {
+          'vnfGroups' : {
+            'vnfGroupStoreKey' : {
+              'vnfs' : {
+                'vnfStoreKey1' : {
+                  'action' : actionName
+                }
+              }
+            }
+
+          }
+        }
+      }
+    }, <UndoDeleteActionRelatedVnfMemeberInstanceAction>{
+      type: RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE,
+      vnfGroupStoreKey: 'vnfGroupStoreKey',
+      relatedVnfMemeberStoreKey : 'vnfStoreKey1',
+      serviceId : 'serviceUuid'
+    });
+
+    expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['vnfStoreKey1'].action).toEqual('None');
+  });
+
+  test('#REMOVE_RELATED_VNF_MEMBER_INSTANCE should remove instance', () => {
+    const serviceUuid: string = 'serviceUuid';
+    const actionName: ServiceInstanceActions = ServiceInstanceActions.None_Delete;
+
+    let service = relatedVnfMemeberReducer(<any>{
+      serviceInstance: {
+        'serviceUuid': {
+          'vnfGroups' : {
+            'vnfGroupStoreKey' : {
+              'vnfs' : {
+                'vnfStoreKey1' : {
+                  'action' : actionName
+                }
+              }
+            }
+
+          }
+        }
+      }
+    }, <UndoDeleteActionRelatedVnfMemeberInstanceAction>{
+      type: RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE,
+      vnfGroupStoreKey: 'vnfGroupStoreKey',
+      relatedVnfMemeberStoreKey : 'vnfStoreKey1',
+      serviceId : 'serviceUuid'
+    });
+
+    expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['vnfStoreKey1'].action).toEqual('None');
+  });
+
+  test('#CREATE_RELATED_VNF_MEMBER_INSTANCE should add new relatedVNF instance', () => {
+    const serviceUuid: string = 'serviceUuid';
+    const actionName: ServiceInstanceActions = ServiceInstanceActions.None_Delete;
+    let relatedVnfMember =  {
+      "instanceName":"VNF1_INSTANCE_NAME",
+      "instanceId":"VNF1_INSTANCE_ID",
+      "orchStatus":null,
+      "productFamilyId":null,
+      "lcpCloudRegionId":"mtn23b",
+      "tenantId":"3e9a20a3e89e45f884e09df0cc2d2d2a",
+      "tenantName":"APPC-24595-T-IST-02C",
+      "modelInfo":{
+        "modelInvariantId":"vnf-instance-model-invariant-id",
+        "modelVersionId":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+        "modelVersion":"2.0",
+        "modelName":"vf_vEPDG",
+        "modelType":"vnf"
+      },
+      "instanceType":"VNF1_INSTANCE_TYPE",
+      "provStatus":null,
+      "inMaint":false,
+      "uuid":"7a6ee536-f052-46fa-aa7e-2fca9d674c44",
+      "originalName":null,
+      "legacyRegion":null,
+      "lineOfBusiness":null,
+      "platformName":null,
+      "trackById":"7a6ee536-f052-46fa-aa7e-2fca9d674c44:002",
+      "serviceInstanceId":"service-instance-id1",
+      "serviceInstanceName":"service-instance-name"
+    };
+
+    let service = relatedVnfMemeberReducer(<any>{
+      serviceInstance: {
+        'serviceUuid': {
+          'vnfGroups' : {
+            'vnfGroupStoreKey' : { }
+          }
+        }
+      }
+    }, <CreateRelatedVnfMemeberInstanceAction>{
+      type: RelatedVnfActions.CREATE_RELATED_VNF_MEMBER_INSTANCE,
+      relatedVnfMember: relatedVnfMember,
+      vnfGroupStoreKey: 'vnfGroupStoreKey',
+      serviceId: serviceUuid
+    });
+
+    expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['VNF1_INSTANCE_ID'].action).toEqual('Create');
+    expect(service.serviceInstance[serviceUuid].vnfGroups['vnfGroupStoreKey']['vnfs']['VNF1_INSTANCE_ID'].instanceId).toEqual('VNF1_INSTANCE_ID');
+  });
+
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/relatedVnfMember/relatedVnfMember.reducers.ts
new file mode 100644 (file)
index 0000000..250f934
--- /dev/null
@@ -0,0 +1,58 @@
+import {Action} from "redux";
+import * as _ from "lodash";
+import {ServiceState} from "../main.reducer";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+import {
+  CreateRelatedVnfMemeberInstanceAction,
+  DeleteActionRelatedVnfMemeberInstanceAction, DeleteRelatedVnfMemebrInstanceAction,
+  RelatedVnfActions,
+  UndoDeleteActionRelatedVnfMemeberInstanceAction
+} from "./relatedVnfMember.actions";
+
+export function relatedVnfMemeberReducer(state: ServiceState, action: Action): ServiceState {
+  switch (action.type) {
+
+    case RelatedVnfActions.DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let relatedVnfMember = newState.serviceInstance[(<DeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<DeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey];
+      let oldAction = relatedVnfMember.action;
+      if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
+      newState.serviceInstance[(<DeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<DeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
+      return newState;
+    }
+
+    case RelatedVnfActions.UNDO_DELETE_ACTION_RELATED_VNF_MEMBER_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let relatedVnfMember = newState.serviceInstance[(<UndoDeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<UndoDeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<UndoDeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey];
+      let oldState = relatedVnfMember.action;
+      newState.serviceInstance[(<DeleteActionRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<DeleteActionRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteActionRelatedVnfMemeberInstanceAction>action).relatedVnfMemeberStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions;
+      return newState;
+    }
+
+    case RelatedVnfActions.REMOVE_RELATED_VNF_MEMBER_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      delete newState.serviceInstance[(<DeleteRelatedVnfMemebrInstanceAction>action).serviceId].vnfGroups[(<DeleteRelatedVnfMemebrInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<DeleteRelatedVnfMemebrInstanceAction>action).relatedVnfMemeberStoreKey];
+      return newState;
+    }
+
+    case RelatedVnfActions.CREATE_RELATED_VNF_MEMBER_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let relatedVnfMember = (<CreateRelatedVnfMemeberInstanceAction>action).relatedVnfMember;
+      relatedVnfMember['action'] = 'Create';
+      relatedVnfMember['vnfStoreKey'] = relatedVnfMember.instanceId;
+      relatedVnfMember['trackById'] = relatedVnfMember.instanceId;
+      relatedVnfMember['instanceName'] = relatedVnfMember.instanceName;
+      if(_.isNil(newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<CreateRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'])){
+        newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<CreateRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'] = {};
+      }
+      newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].vnfGroups[(<CreateRelatedVnfMemeberInstanceAction>action).vnfGroupStoreKey]['vnfs'][(<CreateRelatedVnfMemeberInstanceAction>action).relatedVnfMember['instanceId']] = relatedVnfMember;
+      newState.serviceInstance[(<CreateRelatedVnfMemeberInstanceAction>action).serviceId].isDirty = true;
+      return newState;
+    }
+  }
+}
+
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.actions.ts
new file mode 100644 (file)
index 0000000..e4e7e49
--- /dev/null
@@ -0,0 +1,102 @@
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+import {Action, ActionCreator} from "redux";
+
+export enum ServiceActions {
+  CREATE_SERVICE_INSTANCE = 'CREATE_SERVICE_INSTANCE',
+  UPDATE_SERVICE_INSTANCE = 'UPDATE_SERVICE_INSTANCE',
+  DELETE_ALL_SERVICE_INSTANCES = 'DELETE_ALL_SERVICE_INSTANCES',
+  UPDATE_MODEL  = 'UPDATE_MODEL',
+  ADD_SERVICE_ACTION = 'ADD_SERVICE_ACTION',
+  DELETE_ACTION_SERVICE_INSTANCE = "DELETE_ACTION_SERVICE_INSTANCE",
+  UNDO_DELETE_ACTION_SERVICE_INSTANCE = "UNDO_DELETE_ACTION_SERVICE_INSTANCE",
+  CHANGE_SERVICE_IS_DIRTY = "CHANGE_SERVICE_IS_DIRTY"
+}
+
+export interface CreateServiceInstanceAction extends Action {
+  serviceUuid?: string;
+  serviceInstance?: ServiceInstance;
+}
+
+export interface UpdateServiceInstanceAction extends Action {
+  serviceUuid?: string;
+  serviceInstance?: ServiceInstance;
+}
+
+export interface DeleteServiceInstanceAction extends Action {
+  serviceUuid?: string;
+}
+
+export interface DeleteServiceInstanceAction extends Action {
+  serviceUuid?: string;
+}
+
+export interface UpdateServiceModelAction extends Action {
+  serviceHierarchy?: any;
+}
+
+export interface AddServiceAction extends Action{
+  serviceUuid: string;
+  action: ServiceInstanceActions;
+}
+
+
+export interface DeleteActionServiceInstanceAction extends Action {
+  serviceId?: string;
+}
+
+export interface UndoDeleteActionServiceInstanceAction extends Action {
+  serviceId?: string;
+}
+
+export interface ChangeServiceDirty extends Action {
+  nodes: any[];
+  serviceId : string;
+}
+
+export const addServiceAction: ActionCreator<AddServiceAction> = (serviceUuid : string, actionName : ServiceInstanceActions) => ({
+  type: ServiceActions.ADD_SERVICE_ACTION,
+  serviceUuid: serviceUuid,
+  action : actionName
+});
+
+
+export const deleteAllServiceInstances: ActionCreator<DeleteServiceInstanceAction> = () => ({
+  type: ServiceActions.DELETE_ALL_SERVICE_INSTANCES
+});
+
+export const createServiceInstance: ActionCreator<CreateServiceInstanceAction> = (serviceInstance, serviceUuid) => ({
+  type: ServiceActions.CREATE_SERVICE_INSTANCE,
+  serviceInstance: serviceInstance,
+  serviceUuid: serviceUuid
+});
+
+export const updateServiceInstance: ActionCreator<UpdateServiceInstanceAction> = (serviceInstance, serviceUuid) => ({
+  type: ServiceActions.UPDATE_SERVICE_INSTANCE,
+  serviceInstance: serviceInstance,
+  serviceUuid: serviceUuid
+});
+
+export const updateModel: ActionCreator<UpdateServiceModelAction> = serviceHierarchy => ({
+  type: ServiceActions.UPDATE_MODEL,
+  serviceHierarchy: serviceHierarchy
+});
+
+
+export const deleteActionServiceInstance: ActionCreator<DeleteActionServiceInstanceAction> = (vnfStoreKey, serviceId) => ({
+  type: ServiceActions.DELETE_ACTION_SERVICE_INSTANCE,
+  serviceId: serviceId
+});
+
+export const undoDeleteActionServiceInstance: ActionCreator<UndoDeleteActionServiceInstanceAction> = (vnfStoreKey, serviceId) => ({
+  type: ServiceActions.UNDO_DELETE_ACTION_SERVICE_INSTANCE,
+  serviceId: serviceId
+});
+
+export const changeServiceIsDirty: ActionCreator<ChangeServiceDirty> = (nodes, serviceId) => ({
+  type: ServiceActions.CHANGE_SERVICE_IS_DIRTY,
+  nodes: nodes,
+  serviceId : serviceId
+});
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.spec.ts
new file mode 100644 (file)
index 0000000..05fc008
--- /dev/null
@@ -0,0 +1,499 @@
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {
+  AddServiceAction, ChangeServiceDirty,
+  DeleteServiceInstanceAction,
+  ServiceActions,
+  CreateServiceInstanceAction,
+  UpdateServiceModelAction, UpdateServiceInstanceAction
+} from "./service.actions";
+import {serviceReducer} from "./service.reducers";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+describe('serviceReducer', () => {
+
+  test('#UPDATE_SERVICE_INSTANCE should update exiting instance without change his child', () => {
+    const serviceUuid: string = 'serviceUuid';
+    const actionName: ServiceInstanceActions = ServiceInstanceActions.Create;
+
+    const elemntThatShouldNotOverideOnUpdateService = {
+      vnfs: {
+        "2017-388_ADIOD-vPE 0": {
+          "action": "Create",
+          "inMaint": false,
+          "rollbackOnFailure": "true",
+          "originalName": "2017-388_ADIOD-vPE 0",
+          "isMissingData": false,
+          "trackById": "eymgwlevh54",
+          "vfModules": {},
+          "vnfStoreKey": "2017-388_ADIOD-vPE 0",
+          "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+          "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "lcpCloudRegionId": "JANET25",
+          "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+          "lineOfBusiness": "ONAP",
+          "platformName": "platform",
+          "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",
+            "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+            "modelUniqueId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c"
+          },
+          "instanceName": "2017-388_ADIOD-vPEAjXzainstanceName",
+          "legacyRegion": "some legacy region",
+          "instanceParams": [
+            {
+              "vnf_config_template_version": "17.2",
+              "bandwidth_units": "Gbps",
+              "bandwidth": "10",
+              "AIC_CLLI": "ATLMY8GA",
+              "ASN": "AV_vPE",
+              "vnf_instance_name": "mtnj309me6"
+            }
+          ]
+        },
+        "2017-488_ADIOD-vPE 0": {
+          "action": "Create",
+          "inMaint": false,
+          "rollbackOnFailure": "true",
+          "originalName": "2017-488_ADIOD-vPE 0",
+          "isMissingData": false,
+          "trackById": "xr6o2782z7",
+          "vfModules": {
+            "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0wmkjw": {
+                "isMissingData": true,
+                "sdncPreReload": null,
+                "modelInfo": {
+                  "modelType": "VFmodule",
+                  "modelInvariantId": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                  "modelVersionId": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                  "modelName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                  "modelVersion": "5",
+                  "modelCustomizationId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                  "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                  "modelUniqueId": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3"
+                },
+                "instanceParams": [
+                  {}
+                ],
+                "trackById": "a19sjb1ez2"
+              }
+            }
+          },
+          "vnfStoreKey": "2017-488_ADIOD-vPE 0",
+          "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+          "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "lcpCloudRegionId": "JANET25",
+          "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+          "lineOfBusiness": "ONAP",
+          "platformName": "platform",
+          "modelInfo": {
+            "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",
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+            "modelUniqueId": "1da7b585-5e61-4993-b95e-8e6606c81e45"
+          },
+          "instanceName": "2017-488_ADIOD-vPEVNFinstancename",
+          "legacyRegion": "some legacy region",
+          "instanceParams": [
+            {
+              "vnf_config_template_version": "17.2",
+              "bandwidth_units": "Gbps",
+              "bandwidth": "10",
+              "AIC_CLLI": "ATLMY8GA",
+              "ASN": "AV_vPE",
+              "vnf_instance_name": "mtnj309me6"
+            }
+          ]
+        }
+      },
+      existingVNFCounterMap: {
+        "b3c76f73-eeb5-4fb6-9d31-72a889f1811c": 1,
+        "1da7b585-5e61-4993-b95e-8e6606c81e45": 1
+      },
+      existingVnfGroupCounterMap: {},
+      existingNetworksCounterMap: {},
+      optionalGroupMembersMap : {},
+      networks : {},
+      vnfGroups : {}
+    };
+
+
+    let service = serviceReducer(<any>{
+      "serviceInstance": {
+        "6b528779-44a3-4472-bdff-9cd15ec93450": {
+          "action": "Create",
+          "isDirty": true,
+          "vnfs": elemntThatShouldNotOverideOnUpdateService.vnfs,
+          "instanceParams": [
+            {
+              "2017488_adiodvpe0_ASN": "AV_vPE"
+            }
+          ],
+          "validationCounter": 1,
+          "existingNames": {
+            "ajxzainstancename": "",
+            "2017-488_adiod-vpevnfinstancename": "",
+            "2017-388_adiod-vpeajxzainstancename": ""
+          },
+          "existingVNFCounterMap": elemntThatShouldNotOverideOnUpdateService.existingVNFCounterMap,
+          "existingVnfGroupCounterMap": elemntThatShouldNotOverideOnUpdateService.existingVnfGroupCounterMap,
+          "existingNetworksCounterMap": elemntThatShouldNotOverideOnUpdateService.existingNetworksCounterMap,
+          "optionalGroupMembersMap":elemntThatShouldNotOverideOnUpdateService.optionalGroupMembersMap,
+          "networks": elemntThatShouldNotOverideOnUpdateService.networks,
+          "vnfGroups": elemntThatShouldNotOverideOnUpdateService.vnfGroups,
+          "bulkSize": "3",
+          "instanceName": "AjXzainstancename",
+          "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "subscriptionServiceType": "TYLER SILVIA",
+          "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+          "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "lcpCloudRegionId": "hvf6",
+          "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+          "aicZoneId": "NFT1",
+          "projectName": "WATKINS",
+          "rollbackOnFailure": "true",
+          "aicZoneName": "NFTJSSSS-NFT1",
+          "owningEntityName": "WayneHolland",
+          "testApi": "VNF_API",
+          "tenantName": "AIN Web Tool-15-D-testalexandria",
+          "modelInfo": {
+            "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "modelVersionId": "6b528779-44a3-4472-bdff-9cd15ec93450",
+            "modelName": "action-data",
+            "modelVersion": "1.0",
+            "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+            "modelUniqueId": "6b528779-44a3-4472-bdff-9cd15ec93450"
+          },
+          "isALaCarte": false,
+          "name": "action-data",
+          "version": "1.0",
+          "description": "",
+          "category": "",
+          "uuid": "6b528779-44a3-4472-bdff-9cd15ec93450",
+          "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+          "serviceType": "",
+          "serviceRole": "",
+          "vidNotions": {
+            "instantiationUI": "legacy",
+            "modelCategory": "other",
+            "viewEditUI": "legacy"
+          },
+          "isEcompGeneratedNaming": false,
+          "isMultiStepDesign": false
+        }
+      },
+    }, <UpdateServiceInstanceAction>{
+      type: ServiceActions.UPDATE_SERVICE_INSTANCE,
+      serviceUuid: "6b528779-44a3-4472-bdff-9cd15ec93450",
+      serviceInstance: <any>{
+        aicZoneId: "ATL53",
+        aicZoneName: "AAIATLTE-ATL53",
+        bulkSize: 1,
+        category: "",
+        description: "",
+        globalSubscriberId: "e433710f-9217-458d-a79d-1c7aff376d89",
+        instanceName: "yoav",
+        instanceParams: [{}],
+        invariantUuid: "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+        isALaCarte: false,
+        isEcompGeneratedNaming: false,
+        isMultiStepDesign: false,
+        lcpCloudRegionId: "JANET25",
+        modelInfo: {
+          modelInvariantId: "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+          modelVersionId: "6b528779-44a3-4472-bdff-9cd15ec93450",
+          modelName: "action-data",
+          modelVersion: "1.0"
+        },
+        name: "action-data",
+        owningEntityId: "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+        owningEntityName: "WayneHolland",
+        productFamilyId: "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+        projectName: "WATKINS",
+        rollbackOnFailure: "true",
+        serviceRole: "",
+        serviceType: "",
+        subscriptionServiceType: "TYLER SILVIA",
+        tenantId: "092eb9e8e4b7412e8787dd091bc58e86",
+        tenantName: "USP-SIP-IC-24335-T-01",
+        testApi: "VNF_API",
+        uuid: "6b528779-44a3-4472-bdff-9cd15ec93450",
+        version: "1.0",
+        vidNotions: {instantiationUI: "legacy", modelCategory: "other", viewEditUI: "legacy"}
+      }
+    });
+    expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"]).toBeDefined();
+
+    for(const element in elemntThatShouldNotOverideOnUpdateService){
+      expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"][element]).toEqual(elemntThatShouldNotOverideOnUpdateService[element]);
+    }
+
+    expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].aicZoneId).toEqual("ATL53");
+    expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].owningEntityId).toEqual("d61e6f2d-12fa-4cc2-91df-7c244011d6fc");
+    expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].owningEntityName).toEqual("WayneHolland");
+    expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].productFamilyId).toEqual("d8a6ed93-251c-47ca-adc9-86671fd19f4c");
+    expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].projectName).toEqual("WATKINS");
+    expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].rollbackOnFailure).toEqual("true");
+    expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].subscriptionServiceType).toEqual("TYLER SILVIA");
+    expect(service.serviceInstance["6b528779-44a3-4472-bdff-9cd15ec93450"].tenantId).toEqual("092eb9e8e4b7412e8787dd091bc58e86");
+
+  });
+
+  test('#ADD_SERVICE_ACTION should add action to the service', () => {
+    const serviceUuid: string = 'serviceUuid';
+    const actionName: ServiceInstanceActions = ServiceInstanceActions.Create;
+
+    let service = serviceReducer(<any>{
+      serviceInstance: {
+        'serviceUuid': {}
+      }
+    }, <AddServiceAction>{
+      type: ServiceActions.ADD_SERVICE_ACTION,
+      serviceUuid: 'serviceUuid',
+      action: actionName
+    });
+    expect(service.serviceInstance[serviceUuid]['action']).toEqual(actionName);
+  });
+
+  test('#UPDATE_SERVICE_INSTANCE', () => {
+    const serviceUuid: string = 'serviceUuid';
+
+    let serviceInstanceObject: ServiceInstance = <any>{
+      isDirty: false,
+      instanceName: 'instanceName',
+      isEcompGeneratedNaming: false,
+      globalSubscriberId: 'globalSubscriberId',
+      productFamilyId: 'productFamilyId',
+      subscriptionServiceType: 'subscriptionServiceType',
+      lcpCloudRegionId: 'lcpCloudRegionId',
+      tenantId: 'tenantId',
+      tenantName: 'tenantName',
+      aicZoneId: 'aicZoneId',
+      aicZoneName: 'aicZoneName',
+      projectName: 'projectName',
+      owningEntityId: 'owningEntityId',
+      owningEntityName: 'owningEntityName',
+      existingVnfGroupCounterMap: {},
+      existingVNFCounterMap: {},
+      existingNetworksCounterMap: {},
+      pause: false,
+      bulkSize: 1,
+      vnfs: {},
+      vnfGroups: {},
+      networks: {},
+      instanceParams: [],
+      rollbackOnFailure: false,
+      subscriberName: 'subscriberName',
+      validationCounter: 0,
+      existingNames: {},
+      action: ServiceInstanceActions.Create
+    };
+
+    let serviceState = serviceReducer(<any>{serviceInstance: {}},
+      <CreateServiceInstanceAction>{
+        type: ServiceActions.CREATE_SERVICE_INSTANCE,
+        serviceUuid: serviceUuid,
+        serviceInstance: serviceInstanceObject
+      }).serviceInstance[serviceUuid];
+
+    expect(serviceState.instanceName).toEqual(serviceInstanceObject.instanceName);
+    expect(serviceState.isEcompGeneratedNaming).toEqual(serviceInstanceObject.isEcompGeneratedNaming);
+    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);
+  });
+
+
+  test('#DELETE_ALL_SERVICE_INSTANCES should delete all services', () => {
+    const state = serviceReducer(<any>{
+        serviceInstance: {
+          'service-1': {},
+          'service-2': {}
+        }
+      },
+      <CreateServiceInstanceAction>{
+        type: ServiceActions.DELETE_ALL_SERVICE_INSTANCES
+      });
+
+    expect(state.serviceInstance['service-1']).toBeUndefined();
+    expect(state.serviceInstance['service-2']).toBeUndefined();
+  });
+
+  test('#DELETE_SERVICE_INSTANCE should delete service', () => {
+    const state = serviceReducer(<any>{
+        serviceInstance: {
+          'service-1': {}
+        }
+      },
+      <DeleteServiceInstanceAction>{
+        type: ServiceActions.DELETE_ALL_SERVICE_INSTANCES
+      });
+
+    expect(state.serviceInstance['service-1']).toBeUndefined();
+  });
+
+  test('#UPDATE_MODEL should update service model ', () => {
+    const state = serviceReducer(<any>{
+        serviceHierarchy: {}
+      },
+      <UpdateServiceModelAction>{
+        type: ServiceActions.UPDATE_MODEL,
+        serviceHierarchy: {
+          service: {
+            uuid: 'uuid-1'
+          }
+        }
+      });
+
+    expect(state.serviceHierarchy['uuid-1'].service).toBeDefined();
+  });
+
+  test('#UPDATE_MODEL should update service model with vnfGroups ', () => {
+    const state = serviceReducer(<any>{
+        serviceHierarchy: {}
+      },
+      <UpdateServiceModelAction>{
+        type: ServiceActions.UPDATE_MODEL,
+        serviceHierarchy: {
+          service: {
+            uuid: 'uuid-1'
+          },
+          vnfs: {},
+          vnfGroups: {
+            'vnfGrouop_1': {
+              uuid: 'vnfGroup_uuid_1',
+              name: 'vnfGroup_name_1',
+              type: 'Group'
+            },
+            'vnfGrouop_2': {
+              uuid: 'vnfGroup_uuid_2',
+              name: 'vnfGroup_name_2',
+              type: 'Group'
+            }
+          }
+        }
+      });
+
+    expect(state.serviceHierarchy['uuid-1']).toBeDefined();
+    expect(state.serviceHierarchy['uuid-1'].vnfGroups['vnfGrouop_1']).toBeDefined();
+    expect(state.serviceHierarchy['uuid-1'].vnfGroups['vnfGrouop_2']).toBeDefined();
+  });
+
+  test('#CHANGE_SERVICE_IS_DIRTY should update service isDirty flag : service is not dirty ', () => {
+    const state = serviceReducer(<any>{
+        serviceInstance: {
+          'serviceId': {
+            action: ServiceInstanceActions.None,
+            'vnfs': {
+              'vnf1': {
+                action: ServiceInstanceActions.None
+              },
+              'vnf2': {
+                action: ServiceInstanceActions.None
+              }
+            }
+
+          }
+        }
+      },
+      <ChangeServiceDirty>{
+        type: ServiceActions.CHANGE_SERVICE_IS_DIRTY,
+        nodes: [
+          {
+            action: ServiceInstanceActions.None
+          },
+          {
+            action: ServiceInstanceActions.None
+          }],
+        serviceId: 'serviceId'
+
+      });
+
+    expect(state.serviceInstance['serviceId'].isDirty).toBeFalsy();
+  });
+
+  test('#CHANGE_SERVICE_IS_DIRTY should update service isDirty flag : service is dirty should return true', () => {
+    const state = serviceReducer(<any>{
+        serviceInstance: {
+          'serviceId': {
+            action: ServiceInstanceActions.Create
+
+          }
+        }
+      },
+      <ChangeServiceDirty>{
+        type: ServiceActions.CHANGE_SERVICE_IS_DIRTY,
+        nodes: [
+          {
+            action: ServiceInstanceActions.None
+          },
+          {
+            action: ServiceInstanceActions.None
+          }],
+        serviceId: 'serviceId'
+
+      });
+
+    expect(state.serviceInstance['serviceId'].isDirty).toBeTruthy();
+  });
+
+  test('#CHANGE_SERVICE_IS_DIRTY should update service isDirty flag : vnf is dirty ', () => {
+    const state = serviceReducer(<any>{
+        serviceInstance: {
+          'serviceId': {
+            action: ServiceInstanceActions.None,
+            'vnfs': {
+              'vnf1': {
+                action: ServiceInstanceActions.None
+              },
+              'vnf2': {
+                action: ServiceInstanceActions.Create
+              }
+            }
+
+          }
+        }
+      },
+      <ChangeServiceDirty>{
+        type: ServiceActions.CHANGE_SERVICE_IS_DIRTY,
+        nodes: [
+          {
+            action: ServiceInstanceActions.None
+          },
+          {
+            action: ServiceInstanceActions.Create
+          }],
+        serviceId: 'serviceId'
+
+      });
+
+    expect(state.serviceInstance['serviceId'].isDirty).toBeTruthy();
+  });
+
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/service/service.reducers.ts
new file mode 100644 (file)
index 0000000..9d21d35
--- /dev/null
@@ -0,0 +1,107 @@
+import {Action} from "redux";
+import {
+  AddServiceAction,
+  ChangeServiceDirty,
+  ServiceActions,
+  CreateServiceInstanceAction,
+  UpdateServiceModelAction, UpdateServiceInstanceAction
+} from "./service.actions";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {ServiceState} from "../main.reducer";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+import * as _ from "lodash";
+
+export function serviceReducer(state: ServiceState, action: Action) : ServiceState{
+    switch (action.type) {
+      case ServiceActions.UPDATE_SERVICE_INSTANCE : {
+        let newState = _.cloneDeep(state);
+        const updateServiceInstanceAction = <UpdateServiceInstanceAction>action;
+        const uuid = updateServiceInstanceAction.serviceUuid;
+        const serviceInstance = updateServiceInstanceAction.serviceInstance;
+
+
+        updateUniqueNames(serviceInstance.instanceName, updateServiceInstanceAction.serviceInstance.instanceName, newState.serviceInstance[uuid]);
+
+        newState.serviceInstance[uuid] = _.merge(newState.serviceInstance[uuid], serviceInstance);
+        return newState;
+      }
+      case ServiceActions.CREATE_SERVICE_INSTANCE : {
+        const updateServiceInstanceAction = <CreateServiceInstanceAction>action;
+        const uuid = updateServiceInstanceAction.serviceUuid;
+        let newState = _.cloneDeep(state);
+
+        const serviceInstance: ServiceInstance =  new ServiceInstance();
+        const currentInstaceName = state.serviceInstance[uuid] ? serviceInstance.instanceName : null;
+
+        newState.serviceInstance[uuid] = Object.assign(serviceInstance, updateServiceInstanceAction.serviceInstance);
+        if (!_.isNil(updateServiceInstanceAction.serviceInstance)) {
+          updateUniqueNames(currentInstaceName, updateServiceInstanceAction.serviceInstance.instanceName, newState.serviceInstance[uuid]);
+        }
+        return newState;
+      }
+      case ServiceActions.DELETE_ALL_SERVICE_INSTANCES: {
+        if (state.serviceInstance) {
+          let newState = _.cloneDeep(state);
+          newState.serviceInstance = {};
+          return Object.assign({}, state, newState);
+        }
+        return Object.assign({}, state);
+      }
+      case ServiceActions.UPDATE_MODEL: {
+        let uuid = (<UpdateServiceModelAction>action).serviceHierarchy.service.uuid;
+        state.serviceHierarchy[uuid] = _.cloneDeep((<UpdateServiceModelAction>action).serviceHierarchy);
+        return Object.assign({}, state);
+      }
+      case ServiceActions.ADD_SERVICE_ACTION: {
+        const uuid: string = (<AddServiceAction>action).serviceUuid;
+        const actionToAdd: ServiceInstanceActions =  (<AddServiceAction>action).action;
+        state.serviceInstance[uuid].action =  actionToAdd;
+        return Object.assign({}, state);
+      }
+      case ServiceActions.CHANGE_SERVICE_IS_DIRTY : {
+        let newState = _.cloneDeep(state);
+        let serviceInstanceAction: ServiceInstanceActions = newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].action;
+
+        if(serviceInstanceAction !== ServiceInstanceActions.None){
+          newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].isDirty = true;
+          return newState;
+        }
+
+        const nodes =  (<ChangeServiceDirty>action).nodes;
+        for(let node of nodes){
+          const dirty = isDirty(node);
+          if(dirty) {
+            newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].isDirty = true;
+            return newState;
+          }
+        }
+
+        newState.serviceInstance[(<ChangeServiceDirty>action).serviceId].isDirty = false;
+        return newState;
+      }
+    }
+}
+
+const isDirty = (node) : boolean => {
+  if(node.action !== ServiceInstanceActions.None) return true;
+  if(!_.isNil(node.children) && node.children.length > 0){
+      for(let child of node.children){
+        const dirty: boolean = isDirty(child);
+        if(dirty) return true;
+      }
+  }
+  return false;
+};
+
+const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
+  let existingNames = serviceInstance.existingNames;
+  if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+    delete existingNames[oldName.toLowerCase()];
+  }
+  if(!_.isNil(newName)) {
+    existingNames[newName.toLowerCase()] = "";
+  }
+};
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.actions.ts
new file mode 100644 (file)
index 0000000..a3f0f40
--- /dev/null
@@ -0,0 +1,105 @@
+import {Action, ActionCreator} from "redux";
+
+export enum VfModuleActions {
+  REMOVE_VNF_MODULE_INSTANCE = 'REMOVE_VNF_MODULE_INSTANCE',
+  CREATE_VF_MODULE = 'CREATE_VF_MODULE',
+  UPDATE_VF_MODULE = 'UPDATE_VF_MODULE',
+  DELETE_ACTION_VF_MODULE_INSTANCE = "DELETE_ACTION_VF_MODULE_INSTANCE",
+  UNDO_DELETE_ACTION_VF_MODULE_INSTANCE = "UNDO_DELETE_ACTION_VF_MODULE_INSTANCE",
+  UPDATE_VFMODULE_POSITION = "UPDATE_VFMODULE_POSITION"
+}
+
+
+export interface UpdateVFModluePosition extends Action {
+  node: any,
+  instanceId : string,
+  vnfStoreKey ?: string;
+}
+
+export interface DeleteVfModuleInstanceAction extends Action {
+  modelName?: string;
+  serviceModelId?: string;
+  vfName?: string;
+  vnfStoreKey?:string;
+  dynamicModelName?: string;
+}
+
+export interface CreateVFModuleInstanceAction extends Action {
+  vfInstance: any;
+  vfId: string;
+  serviceUuid: string;
+  index : number
+  vnfStoreKey : string;
+}
+
+export interface UpdateVFModuleInstanceAction extends Action {
+  vfInstance: any;
+  vfId: string;
+  serviceUuid: string;
+  dynamicModelName : string;
+  vnfStoreKey : string
+}
+
+
+export interface DeleteActionVfModuleInstanceAction extends Action {
+  dynamicModelName: string;
+  vnfStoreKey : string;
+  serviceId?: string;
+}
+
+export interface UndoDeleteActionVfModuleInstanceAction extends Action {
+  dynamicModelName: string;
+  vnfStoreKey : string;
+  serviceId?: string;
+}
+
+export const removeVfModuleInstance: ActionCreator<DeleteVfModuleInstanceAction> = (modelName, serviceModelId, vfName, vnfStoreKey, dynamicModelName) => ({
+  type: VfModuleActions.REMOVE_VNF_MODULE_INSTANCE,
+  modelName: modelName,
+  serviceModelId: serviceModelId,
+  vfName: vfName,
+  vnfStoreKey : vnfStoreKey,
+  dynamicModelName:dynamicModelName
+});
+
+
+export const createVFModuleInstance: ActionCreator<CreateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid, index, vnfStoreKey) => ({
+  type: VfModuleActions.CREATE_VF_MODULE,
+  vfInstance: vfInstance,
+  vfId: vfId,
+  serviceUuid: serviceUuid,
+  index : index,
+  vnfStoreKey : vnfStoreKey
+});
+
+export const updateVFModuleInstance: ActionCreator<UpdateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid, dynamicModelName, vnfStoreKey) => ({
+  type: VfModuleActions.UPDATE_VF_MODULE,
+  vfInstance: vfInstance,
+  vfId: vfId,
+  serviceUuid: serviceUuid,
+  dynamicModelName : dynamicModelName,
+  vnfStoreKey : vnfStoreKey
+});
+
+export const deleteActionVfModuleInstance: ActionCreator<DeleteActionVfModuleInstanceAction> = (dynamicModelName, vnfStoreKey, serviceId) => ({
+  type: VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE,
+  dynamicModelName: dynamicModelName,
+  vnfStoreKey : vnfStoreKey,
+  serviceId: serviceId
+});
+
+export const undoDeleteVfModuleInstance: ActionCreator<UndoDeleteActionVfModuleInstanceAction> = (dynamicModelName, vnfStoreKey, serviceId) => ({
+  type: VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE,
+  dynamicModelName: dynamicModelName,
+  vnfStoreKey : vnfStoreKey,
+  serviceId: serviceId
+});
+
+
+export const updateVFModulePosition: ActionCreator<UpdateVFModluePosition> = (node, instanceId, vnfStoreKey) => ({
+  type: VfModuleActions.UPDATE_VFMODULE_POSITION,
+  node: node,
+  instanceId: instanceId,
+  vnfStoreKey : vnfStoreKey
+});
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.spec.ts
new file mode 100644 (file)
index 0000000..de6d214
--- /dev/null
@@ -0,0 +1,248 @@
+import {
+  CreateVFModuleInstanceAction,
+  DeleteActionVfModuleInstanceAction,
+  DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition,
+  VfModuleActions
+} from "./vfModule.actions";
+import {vfModuleReducer} from "./vfModule.reducers";
+import {VfModuleInstance} from "../../../models/vfModuleInstance";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+
+describe('vfModuleReducer', () => {
+  test('#REMOVE_VNF_MODULE_INSTANCE : should delete existing vnf module by dynamicModelName', () => {
+    let state = vfModuleReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vfName' : {
+                vfModules : {
+                  'modelName' : {
+                    'dynamicModelName1': {},
+                    'dynamicModelName2': {},
+                  }
+                }
+              }
+            }
+          }
+        }},
+      <DeleteVfModuleInstanceAction>{
+        type: VfModuleActions.REMOVE_VNF_MODULE_INSTANCE,
+        modelName : 'modelName',
+        vfName : 'vfName',
+        vnfStoreKey : 'vfName',
+        serviceModelId : 'serviceModelId',
+        dynamicModelName: 'dynamicModelName1'
+      });
+
+    expect(state).toBeDefined();
+    expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']['dynamicModelName2']).toBeDefined();
+    expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']['dynamicModelName1']).not.toBeDefined();
+  });
+
+  test('#DELETE_LAST_VNF_MODULE_INSTANCE : should delete existing vnf module', () => {
+    let state = vfModuleReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vfName' : {
+                vfModules : {
+                  'modelName' : {
+                    'dynamicModelName': {
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }},
+      <DeleteVfModuleInstanceAction>{
+        type: VfModuleActions.REMOVE_VNF_MODULE_INSTANCE,
+        modelName : 'modelName',
+        vfName : 'vfName',
+        vnfStoreKey : 'vfName',
+        serviceModelId : 'serviceModelId',
+        dynamicModelName: 'dynamicModelName'
+      });
+
+    expect(state).toBeDefined();
+    expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']).not.toBeDefined();
+  });
+
+  test('#CREATE_VF_MODULE: should create new vfModule to existing VNF', ()=>{
+    let vfModuleInstance : VfModuleInstance = new VfModuleInstance();
+    vfModuleInstance.instanceName = 'instanceName';
+    vfModuleInstance.isMissingData = false;
+    vfModuleInstance.volumeGroupName = 'volumeGroupName';
+    let vfModule = vfModuleReducer(<any>{serviceInstance : {
+          'serviceUuid' : {
+            vnfs : {
+              'vnfStoreKey' : {
+                'vfModules' : {
+                }
+              }
+            }
+          }
+        }},
+      <CreateVFModuleInstanceAction>{
+        type: VfModuleActions.CREATE_VF_MODULE,
+        vfId : 'vfId',
+        vfInstance : new VfModuleInstance(),
+        vnfStoreKey : 'vnfStoreKey',
+        serviceUuid : 'serviceUuid',
+        index : 1
+      }).serviceInstance['serviceUuid'].vnfs['vnfStoreKey'].vfModules;
+
+    let firstVfModuleName = Object.keys(vfModule)[0];
+    expect(vfModule[firstVfModuleName]).toBeDefined();
+    expect(vfModule[firstVfModuleName].isMissingData).toBeFalsy();
+  });
+
+  test('#UPDATE_VF_MODULE: should update existing VFModule', ()=>{
+    let vfModuleInstance : VfModuleInstance = new VfModuleInstance();
+    vfModuleInstance.instanceName = 'instanceName';
+    vfModuleInstance.isMissingData = false;
+    vfModuleInstance.volumeGroupName = 'volumeGroupName';
+    let vfModule = vfModuleReducer(<any>{
+      serviceHierarchy : {
+        'serviceModelId' : {}
+      },
+      serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vfName' : {
+                vfModules : {
+                  'modelName' : {
+                    'dynamicModelName1': {
+                      isMissingData : true
+                    },
+                    'dynamicModelName2': {},
+                  }
+                }
+              }
+            }
+          }
+        }},
+      <CreateVFModuleInstanceAction>{
+        type: VfModuleActions.UPDATE_VF_MODULE,
+        vfId : 'modelName',
+        vfInstance : new VfModuleInstance(),
+        vnfStoreKey : 'vfName',
+        dynamicModelName : 'dynamicModelName1',
+        serviceUuid : 'serviceModelId',
+        index : 1
+      }).serviceInstance['serviceModelId'].vnfs['vfName'].vfModules;
+
+    let firstVfModuleName = Object.keys(vfModule)[0];
+    expect(vfModule[firstVfModuleName]).toBeDefined();
+    expect(vfModule[firstVfModuleName].isMissingData).toBeFalsy();
+  });
+
+
+  test('#UPDATE_VFMODULE_POSITION: should update position', ()=>{
+    let vfModule = vfModuleReducer(<any>{
+        serviceHierarchy : {
+          'serviceModelId' : {}
+        },
+        serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vfName' : {
+                vfModules : {
+                  'modelName' : {
+                    'dynamicModelName': {
+                      isMissingData : true
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }},
+      <UpdateVFModluePosition>{
+        type: VfModuleActions.UPDATE_VFMODULE_POSITION,
+        node: {
+          position : 1,
+          dynamicModelName : "dynamicModelName",
+          modelName : "modelName"
+        },
+        instanceId : "serviceModelId",
+        vnfStoreKey : "vfName"
+
+      }).serviceInstance['serviceModelId'].vnfs['vfName'].vfModules["modelName"]["dynamicModelName"];
+
+      expect(vfModule.position).toEqual(1);
+  });
+
+
+  test('#DELETE_ACTION_VF_MODULE_INSTANCE', ()=>{
+    let vfModule = vfModuleReducer(<any>{
+      serviceHierarchy : {
+        'serviceModelId' : {}
+      },
+      serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vnfStoreKey' : {
+                vfModules : {
+                  'modelName' : {
+                    'dynamicModelName1': {
+                      isMissingData : true,
+                      action : 'None'
+                    },
+                    'dynamicModelName2': {},
+                  }
+                }
+              }
+            }
+          }
+        }},
+      <DeleteActionVfModuleInstanceAction>{
+        type: VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE,
+        dynamicModelName: 'dynamicModelName1',
+        vnfStoreKey : 'vnfStoreKey',
+        serviceId: 'serviceModelId'
+      }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
+
+    console.log(vfModule.action);
+    expect(vfModule).toBeDefined();
+    expect(vfModule.isMissingData).toBeTruthy();
+    expect(vfModule.action).toEqual(ServiceInstanceActions.None_Delete);
+  });
+
+  test('#UNDO_DELETE_ACTION_VF_MODULE_INSTANCE', ()=>{
+    let vfModule = vfModuleReducer(<any>{
+        serviceHierarchy : {
+          'serviceModelId' : {}
+        },
+        serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vnfStoreKey' : {
+                vfModules : {
+                  'modelName' : {
+                    'dynamicModelName1': {
+                      isMissingData : true,
+                      action : 'None_Delete'
+                    },
+                    'dynamicModelName2': {},
+                  }
+                }
+              }
+            }
+          }
+        }},
+      <UndoDeleteActionVfModuleInstanceAction>{
+        type: VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE,
+        dynamicModelName: 'dynamicModelName1',
+        vnfStoreKey : 'vnfStoreKey',
+        serviceId: 'serviceModelId'
+      }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
+
+    console.log(vfModule.action);
+    expect(vfModule).toBeDefined();
+    expect(vfModule.action).toEqual(ServiceInstanceActions.None);
+  });
+
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.ts
new file mode 100644 (file)
index 0000000..f3636ff
--- /dev/null
@@ -0,0 +1,165 @@
+import {Action} from "redux";
+import * as _ from "lodash";
+import {
+  CreateVFModuleInstanceAction, DeleteActionVfModuleInstanceAction,
+  DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition,
+  UpdateVFModuleInstanceAction,
+  VfModuleActions
+} from "./vfModule.actions";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {VfModuleMap} from "../../../models/vfModulesMap";
+import {ServiceState} from "../main.reducer";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+
+export function vfModuleReducer(state: ServiceState , action: Action) : ServiceState{
+  switch (action.type) {
+    case VfModuleActions.CREATE_VF_MODULE: {
+      const updateVFModuleInstanceAction = <CreateVFModuleInstanceAction>action;
+      const vfInstance = updateVFModuleInstanceAction.vfInstance;
+      const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
+      const vfModuleId = updateVFModuleInstanceAction.vfId;
+      const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
+
+      let newState = Object.assign({}, state);
+
+      let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] || new VfModuleMap();
+      let randomId = generateId();
+      vfModulesMap[vfModuleId + randomId] = vfInstance;
+      updateUniqueNames(null, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
+      updateUniqueNames(null, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
+      updateServiceValidationCounter(newState, false, vfInstance['isMissingData'], serviceUuid);
+
+      newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey].vfModules[vfModuleId] = vfModulesMap;
+      return newState;
+    }
+    case VfModuleActions.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;
+      let vnfId = getVfModuleParentVnfId(vnfs, vfModuleId);
+      const vnfStoreKey = updateVFModuleInstanceAction.vnfStoreKey;
+      if (!_.isNil(vnfStoreKey)) {
+        vnfId = vnfStoreKey;
+      }
+      let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap();
+      updateServiceValidationCounter(newState, vfModulesMap[updateVFModuleInstanceAction.dynamicModelName]['isMissingData'], vfInstance.isMissingData, serviceUuid);
+      updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].instanceName, vfInstance.instanceName, newState.serviceInstance[serviceUuid]);
+      updateUniqueNames(vfModulesMap[updateVFModuleInstanceAction.dynamicModelName].volumeGroupName, vfInstance.volumeGroupName, newState.serviceInstance[serviceUuid]);
+      vfModulesMap[updateVFModuleInstanceAction.dynamicModelName] = vfInstance;
+      newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap;
+      return newState;
+    }
+    case VfModuleActions.REMOVE_VNF_MODULE_INSTANCE: {
+      const actionData = (<DeleteVfModuleInstanceAction>action);
+      if (state.serviceInstance[actionData.serviceModelId]) {
+        let vfModulesMap = state.serviceInstance[actionData.serviceModelId].vnfs[actionData.vnfStoreKey].vfModules;
+        updateIsMissingDataOnDeleteVFModule(state, actionData.serviceModelId, actionData.vnfStoreKey, actionData.modelName);
+        updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].instanceName, null, state.serviceInstance[actionData.serviceModelId] );
+        updateUniqueNames(vfModulesMap[actionData.modelName][actionData.dynamicModelName].volumeGroupName, null, state.serviceInstance[actionData.serviceModelId] );
+        delete vfModulesMap[actionData.modelName][actionData.dynamicModelName];
+        if(_.isEmpty(vfModulesMap[actionData.modelName])){
+          delete vfModulesMap[actionData.modelName];
+        }
+      }
+      return Object.assign({}, state);
+    }
+    case VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules;
+
+      for(let key in vfModules){
+        let firstKey = Object.keys(vfModules[key])[0];
+        if(firstKey === (<DeleteActionVfModuleInstanceAction>action).dynamicModelName){
+          let oldAction = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action;
+          if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
+          newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
+          updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key);
+          return newState;
+        }
+      }
+      return newState;
+    }
+    case VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let vfModules = newState.serviceInstance[(<DeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<DeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules;
+
+      for(let key in vfModules){
+        let firstKey = Object.keys(vfModules[key])[0];
+        if(firstKey === (<UndoDeleteActionVfModuleInstanceAction>action).dynamicModelName){
+          let oldAction = newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action;
+          newState.serviceInstance[(<UndoDeleteActionVfModuleInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey].vfModules[key][firstKey].action = (oldAction.split('_')[0]) as ServiceInstanceActions;
+          updateIsMissingDataOnDeleteVFModule(newState, (<UndoDeleteActionVfModuleInstanceAction>action).serviceId, (<UndoDeleteActionVfModuleInstanceAction>action).vnfStoreKey, key);
+          return newState;
+        }
+      }
+      return newState;
+    }
+
+    case VfModuleActions.UPDATE_VFMODULE_POSITION : {
+      const updateVFModluePosition = <UpdateVFModluePosition>action;
+      const serviceUuid = updateVFModluePosition.instanceId;
+      const dynamicModelName = updateVFModluePosition.node.dynamicModelName;
+      const modelName = updateVFModluePosition.node.modelName;
+      const newState = _.cloneDeep(state);
+
+      newState.serviceInstance[serviceUuid].vnfs[updateVFModluePosition.vnfStoreKey].vfModules[modelName][dynamicModelName].position = updateVFModluePosition.node.position;
+      return newState;
+    }
+  }
+}
+
+const updateIsMissingDataOnDeleteVFModule = (state: any, serviceModelId: string, vnfStoreKey: string, vfModuleName): void => {
+  const vfModules = state.serviceInstance[serviceModelId].vnfs[vnfStoreKey].vfModules[vfModuleName];
+
+  _.forOwn(vfModules, (vfModuleInstance) => {
+    let isMissingData: boolean = vfModuleInstance.isMissingData;
+    updateServiceValidationCounter(state, isMissingData, false, serviceModelId);
+  });
+};
+
+
+const updateUniqueNames = (oldName : string, newName : string, serviceInstance : ServiceInstance) : void => {
+  let existingNames = serviceInstance.existingNames;
+  if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+    delete existingNames[oldName.toLowerCase()];
+  }
+  if(!_.isNil(newName)) {
+    existingNames[newName.toLowerCase()] = "";
+  }
+};
+
+const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
+  if (oldValidationState && !newValidationState) {
+    newState.serviceInstance[serviceUuid].validationCounter--;
+  } else if (!oldValidationState && newValidationState) {
+    newState.serviceInstance[serviceUuid].validationCounter++;
+  }
+};
+
+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/shared/storeUtil/utils/vnf/vnf.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.actions.ts
new file mode 100644 (file)
index 0000000..b842844
--- /dev/null
@@ -0,0 +1,99 @@
+import {Action, ActionCreator} from "redux";
+import {VnfInstance} from "../../../models/vnfInstance";
+
+export enum VNFActions {
+  CREATE_VNF_INSTANCE = "CREATE_VNF_INSTANCE",
+  UPDATE_VNF_INSTANCE = "UPDATE_VNF_INSTANCE",
+  REMOVE_VNF_INSTANCE = "REMOVE_VNF_INSTANCE",
+  DELETE_ACTION_VNF_INSTANCE = "DELETE_VNF_INSTANCE",
+  UNDO_DELETE_ACTION_VNF_INSTANCE = "UNDO_DELETE_VNF_INSTANCE",
+  UPDATE_VNF_POSITION = "UPDATE_VNF_POISTION"
+}
+
+
+export interface CreateVnfInstanceAction extends Action {
+  vnfInstance?: VnfInstance;
+  vnfModelName?: string;
+  serviceUuid?: string;
+  vnfStoreKey?:string;
+}
+
+export interface UpdateVnfPosition extends Action {
+  node: any,
+  instanceId : string,
+  vnfStoreKey?: string;
+}
+
+export interface UpdateVnfInstanceAction extends Action {
+  vnfInstance?: VnfInstance;
+  vnfModelName?: string;
+  serviceUuid?: string;
+  vnfStoreKey?:string;
+}
+
+
+
+export interface DeleteActionVnfInstanceAction extends Action {
+  vnfStoreKey: string;
+  serviceId?: string;
+}
+
+export interface UndoDeleteActionVnfInstanceAction extends Action {
+  vnfStoreKey: string;
+  serviceId?: string;
+}
+
+export interface RemoveVnfInstanceAction extends Action {
+  vnfStoreKey: string;
+  serviceId?: string;
+}
+
+export const createVNFInstance: ActionCreator<CreateVnfInstanceAction> = (vnfInstance, vnfModelName, serviceUuid, vnfStoreKey) => ({
+  type: VNFActions.CREATE_VNF_INSTANCE,
+  vnfInstance: vnfInstance,
+  vnfModelName: vnfModelName,
+  serviceUuid: serviceUuid,
+  vnfStoreKey : vnfStoreKey
+});
+
+
+export const updateVNFInstance: ActionCreator<UpdateVnfInstanceAction> = (vnfInstance, vnfModelName, serviceUuid, vnfStoreKey) => ({
+  type: VNFActions.UPDATE_VNF_INSTANCE,
+  vnfInstance: vnfInstance,
+  vnfModelName: vnfModelName,
+  serviceUuid: serviceUuid,
+  vnfStoreKey : vnfStoreKey
+});
+
+
+export const deleteActionVnfInstance: ActionCreator<DeleteActionVnfInstanceAction> = (vnfStoreKey, serviceId) => ({
+  type: VNFActions.DELETE_ACTION_VNF_INSTANCE,
+  vnfStoreKey: vnfStoreKey,
+  serviceId: serviceId
+});
+
+export const undoDeleteActionVnfInstance: ActionCreator<UndoDeleteActionVnfInstanceAction> = (vnfStoreKey, serviceId) => ({
+  type: VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE,
+  vnfStoreKey: vnfStoreKey,
+  serviceId: serviceId
+});
+
+export const removeVnfInstance: ActionCreator<RemoveVnfInstanceAction> = (vnfStoreKey, serviceId) => ({
+  type: VNFActions.REMOVE_VNF_INSTANCE,
+  vnfStoreKey: vnfStoreKey,
+  serviceId: serviceId
+});
+
+export const updateVnfPosition: ActionCreator<UpdateVnfPosition> = (node, instanceId, vnfStoreKey) => ({
+  type: VNFActions.UPDATE_VNF_POSITION,
+  node: node,
+  instanceId: instanceId,
+  vnfStoreKey : vnfStoreKey
+});
+
+
+
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.spec.ts
new file mode 100644 (file)
index 0000000..3241f11
--- /dev/null
@@ -0,0 +1,132 @@
+import {VnfInstance} from "../../../models/vnfInstance";
+import {
+  CreateVnfInstanceAction,
+  DeleteActionVnfInstanceAction, RemoveVnfInstanceAction,
+  UndoDeleteActionVnfInstanceAction, UpdateVnfPosition,
+  VNFActions
+} from "./vnf.actions";
+import {vnfReducer} from "./vnf.reducers";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+describe('networkReducer', () => {
+  test('#UPDATE_VNF_POSITION', () => {
+    let vnfInstance: VnfInstance = new VnfInstance();
+    vnfInstance.isMissingData = false;
+    vnfInstance.instanceName = 'instanceName';
+    let vnfState = vnfReducer(<any>{
+      serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              "vnfStoreKey" : {
+
+              }
+            }
+          }
+        }},
+      <UpdateVnfPosition>{
+        type: VNFActions.UPDATE_VNF_POSITION,
+        node : <any>{
+          position : 1
+        },
+        vnfStoreKey : 'vnfStoreKey',
+        instanceId : 'serviceModelId'
+      }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'];
+
+    expect(vnfState).toBeDefined();
+    expect(vnfState.position).toEqual(1);
+  });
+
+  test('#CREATE_NETWORK_INSTANCE', () => {
+    let vnfInstance: VnfInstance = new VnfInstance();
+    vnfInstance.isMissingData = false;
+    vnfInstance.instanceName = 'instanceName';
+    let vnfState = vnfReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+
+            }
+          }
+        }},
+      <CreateVnfInstanceAction>{
+        type: VNFActions.CREATE_VNF_INSTANCE,
+        vnfInstance : vnfInstance,
+        vnfStoreKey : null,
+        vnfModelName : 'vnfModelName',
+        serviceUuid : 'serviceModelId'
+      }).serviceInstance['serviceModelId'].vnfs['vnfModelName'];
+
+    expect(vnfState).toBeDefined();
+    expect(vnfState.isMissingData).toBeFalsy();
+  });
+
+  test('#DELETE_ACTION_VNF_INSTANCE', () => {
+    let vnfState = vnfReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vnfStoreKey' : {
+                isMissingData : true,
+                action : 'None'
+              }
+            }
+          }
+        }},
+      <DeleteActionVnfInstanceAction>{
+        type: VNFActions.DELETE_ACTION_VNF_INSTANCE,
+        vnfStoreKey: 'vnfStoreKey',
+        serviceId: 'serviceModelId'
+      }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'];
+
+    expect(vnfState).toBeDefined();
+    expect(vnfState.action).toEqual(ServiceInstanceActions.None_Delete);
+  });
+
+  test('#UNDO_DELETE_ACTION_VNF_INSTANCE', () => {
+    let vnfState = vnfReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vnfStoreKey' : {
+                isMissingData : true,
+                action : 'Update_Delete'
+              }
+            }
+          }
+        }},
+      <UndoDeleteActionVnfInstanceAction>{
+        type: VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE,
+        vnfStoreKey: 'vnfStoreKey',
+        serviceId: 'serviceModelId'
+      }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'];
+
+    expect(vnfState).toBeDefined();
+    expect(vnfState.action).toEqual(ServiceInstanceActions.Update);
+  });
+
+  test('#REMOVE_VNF_INSTANCE', () => {
+    let vnfs = vnfReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vnfStoreKey' : {
+                isMissingData : true,
+                action : 'Update_Delete'
+              },
+              'vnfStoreKey_1' : {
+                isMissingData : true,
+                action : 'Update_Delete'
+              }
+            }
+          }
+        }},
+      <RemoveVnfInstanceAction>{
+        type: VNFActions.REMOVE_VNF_INSTANCE,
+        vnfStoreKey: 'vnfStoreKey',
+        serviceId: 'serviceModelId'
+      }).serviceInstance['serviceModelId'].vnfs;
+
+    expect(vnfs).toBeDefined();
+    expect(vnfs['vnfStoreKey']).toBeUndefined();
+  });
+
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnf/vnf.reducers.ts
new file mode 100644 (file)
index 0000000..cc24d8d
--- /dev/null
@@ -0,0 +1,124 @@
+import {Action} from "redux";
+import {VnfInstance} from "../../../models/vnfInstance";
+import {
+  CreateVnfInstanceAction,
+  DeleteActionVnfInstanceAction, RemoveVnfInstanceAction, UndoDeleteActionVnfInstanceAction,
+  UpdateVnfInstanceAction, UpdateVnfPosition,
+  VNFActions
+} from "./vnf.actions";
+import * as _ from "lodash";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {ServiceState} from "../main.reducer";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+export function vnfReducer(state: ServiceState, action: Action): ServiceState {
+  switch (action.type) {
+    case VNFActions.CREATE_VNF_INSTANCE: {
+      const updateVnfInstanceAction = <CreateVnfInstanceAction>action;
+      const serviceUuid = updateVnfInstanceAction.serviceUuid;
+      let vnfModelName = updateVnfInstanceAction.vnfModelName;
+      let newState = _.cloneDeep(state);
+
+      updateVnfInstanceAction.vnfInstance.originalName = vnfModelName;
+      updateVnfInstanceAction.vnfModelName = calculateNextUniqueModelName(vnfModelName, serviceUuid, newState, 'vnfs');
+
+      let vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfModelName];
+      vnfInstance = new VnfInstance();
+      updateVnfInstanceAction.vnfInstance.vnfStoreKey = updateVnfInstanceAction.vnfModelName;
+      updateVnfInstanceAction.vnfInstance.originalName = vnfModelName;
+      vnfInstance.originalName = updateVnfInstanceAction.vnfInstance.originalName;
+      vnfInstance.vnfStoreKey = updateVnfInstanceAction.vnfInstance.vnfStoreKey;
+      updateServiceValidationCounter(newState, vnfInstance['isMissingData'], updateVnfInstanceAction.vnfInstance['isMissingData'], serviceUuid);
+
+      newState.serviceInstance[serviceUuid].vnfs[updateVnfInstanceAction.vnfModelName] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
+      return newState;
+    }
+
+    case VNFActions.UPDATE_VNF_INSTANCE: {
+      const updateVnfInstanceAction = <UpdateVnfInstanceAction>action;
+      const serviceUuid = updateVnfInstanceAction.serviceUuid;
+      let vnfStoreKey = updateVnfInstanceAction.vnfStoreKey;
+
+
+      let newState = _.cloneDeep(state);
+      let vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey];
+      updateUniqueNames(vnfInstance ? vnfInstance.instanceName : null, updateVnfInstanceAction.vnfInstance.instanceName, newState.serviceInstance[serviceUuid]);
+
+      vnfInstance = vnfInstance || new VnfInstance();
+      updateServiceValidationCounter(newState, vnfInstance['isMissingData'], updateVnfInstanceAction.vnfInstance['isMissingData'], serviceUuid);
+
+      newState.serviceInstance[serviceUuid].vnfs[vnfStoreKey] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
+      return newState;
+    }
+
+    case VNFActions.DELETE_ACTION_VNF_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let vnf = newState.serviceInstance[(<DeleteActionVnfInstanceAction>action).serviceId].vnfs[(<DeleteActionVnfInstanceAction>action).vnfStoreKey];
+      let oldAction = vnf.action;
+      if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
+      newState.serviceInstance[(<DeleteActionVnfInstanceAction>action).serviceId].vnfs[(<DeleteActionVnfInstanceAction>action).vnfStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
+      updateServiceValidationCounter(newState, vnf['isMissingData'], false,  (<RemoveVnfInstanceAction>action).serviceId);
+      return newState;
+    }
+
+    case VNFActions.UNDO_DELETE_ACTION_VNF_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let vnf = newState.serviceInstance[(<UndoDeleteActionVnfInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVnfInstanceAction>action).vnfStoreKey];
+      let oldState = vnf.action;
+      newState.serviceInstance[(<UndoDeleteActionVnfInstanceAction>action).serviceId].vnfs[(<UndoDeleteActionVnfInstanceAction>action).vnfStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions;
+      updateServiceValidationCounter(newState, vnf['isMissingData'], false,  (<UndoDeleteActionVnfInstanceAction>action).serviceId);
+      return newState;
+    }
+
+    case VNFActions.REMOVE_VNF_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let vnfInstance = newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey];
+      updateServiceValidationCounter(newState, vnfInstance['isMissingData'], false,  (<RemoveVnfInstanceAction>action).serviceId);
+      delete newState.serviceInstance[(<RemoveVnfInstanceAction>action).serviceId].vnfs[(<RemoveVnfInstanceAction>action).vnfStoreKey];
+      return newState;
+    }
+
+    case VNFActions.UPDATE_VNF_POSITION : {
+      let newState = _.cloneDeep(state);
+      newState.serviceInstance[(<UpdateVnfPosition>action).instanceId].vnfs[(<UpdateVnfPosition>action).vnfStoreKey].position = (<UpdateVnfPosition>action).node.position;
+      return newState;
+    }
+  }
+}
+
+const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
+  if (oldValidationState && !newValidationState) {
+    newState.serviceInstance[serviceUuid].validationCounter--;
+  } else if (!oldValidationState && newValidationState) {
+    newState.serviceInstance[serviceUuid].validationCounter++;
+  }
+};
+
+
+const updateUniqueNames = (oldName: string, newName: string, serviceInstance: ServiceInstance): void => {
+  let existingNames = serviceInstance.existingNames;
+  if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+    delete existingNames[oldName.toLowerCase()];
+  }
+  if (!_.isNil(newName)) {
+    existingNames[newName.toLowerCase()] = "";
+  }
+};
+
+
+export const calculateNextUniqueModelName = (vnfModelName: string, serviceId: string, state: any, levelName: string): string => {
+  let counter: number = null;
+  while (true) {
+    let pattern = !_.isNil(counter) ? ("_" + counter) : "";
+    if (!_.isNil(state.serviceInstance[serviceId][levelName][vnfModelName + pattern])) {
+      counter = counter ? (counter + 1) : 1;
+    } else {
+      return vnfModelName + pattern;
+    }
+  }
+};
+
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.actions.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.actions.ts
new file mode 100644 (file)
index 0000000..4ed377b
--- /dev/null
@@ -0,0 +1,82 @@
+import {Action, ActionCreator} from "redux";
+import {VnfGroupInstance} from "../../../models/vnfGroupInstance";
+import {VnfMember} from "../../../models/VnfMember";
+
+export enum VnfGroupActions {
+  CREATE_VNF_GROUP_INSTANCE = "CREATE_VNF_GROUP_INSTANCE",
+  UPDATE_VNF_GROUP_INSTANCE = "UPDATE_VNF_GROUP_INSTANCE",
+  DELETE_ACTION_VNF_GROUP_INSTANCE = "DELETE_VNF_GROUP_INSTANCE",
+  UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE = "UNDO_DELETE_VNF_GROUP_INSTANCE",
+  SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE = "SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE"
+}
+
+
+export interface CreateVnfGroupInstanceAction extends Action {
+  vnfGroupInstance?: VnfGroupInstance;
+  vnfGroupModelName?: string;
+  serviceUuid?: string;
+  vnfGroupStoreKey?:string;
+}
+
+export interface UpdateVnfGroupInstanceAction extends Action {
+  vnfGroupInstance?: VnfGroupInstance;
+  vnfGroupModelName?: string;
+  serviceUuid?: string;
+  vnfGroupStoreKey?:string;
+}
+
+export interface DeleteActionVnfGroupInstanceAction extends Action {
+  vnfGroupStoreKey: string;
+  serviceId?: string;
+}
+
+export interface UndoDeleteActionVnfGroupInstanceAction extends Action {
+  vnfGroupStoreKey: string;
+  serviceId?: string;
+}
+
+export interface SetOptionalMembersVnfGroupInstanceAction extends Action{
+  path?: string;
+  serviceId?: string;
+  vnfMembers?: VnfMember[]
+}
+
+export const createVnfGroupInstance: ActionCreator<CreateVnfGroupInstanceAction> = (vnfGroupInstance, vnfGroupModelName, serviceUuid, vnfGroupStoreKey) => ({
+  type: VnfGroupActions.CREATE_VNF_GROUP_INSTANCE,
+  vnfGroupInstance: vnfGroupInstance,
+  vnfGroupModelName: vnfGroupModelName,
+  serviceUuid: serviceUuid,
+  vnfGroupStoreKey : vnfGroupStoreKey
+});
+
+
+export const updateVnfGroupInstance: ActionCreator<UpdateVnfGroupInstanceAction> = (vnfGroupInstance, vnfGroupModelName, serviceUuid, vnfGroupStoreKey) => ({
+  type: VnfGroupActions.UPDATE_VNF_GROUP_INSTANCE,
+  vnfGroupInstance: vnfGroupInstance,
+  vnfGroupModelName: vnfGroupModelName,
+  serviceUuid: serviceUuid,
+  vnfGroupStoreKey : vnfGroupStoreKey
+});
+
+export const deleteActionVnfGroupInstance: ActionCreator<DeleteActionVnfGroupInstanceAction> = (vnfGroupStoreKey, serviceId) => ({
+  type: VnfGroupActions.DELETE_ACTION_VNF_GROUP_INSTANCE,
+  vnfGroupStoreKey: vnfGroupStoreKey,
+  serviceId: serviceId
+});
+
+export const undoDeleteActionVnfGroupInstance: ActionCreator<UndoDeleteActionVnfGroupInstanceAction> = (vnfGroupStoreKey, serviceId) => ({
+  type: VnfGroupActions.UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE,
+  vnfGroupStoreKey: vnfGroupStoreKey,
+  serviceId: serviceId
+});
+
+export const setOptionalMembersVnfGroupInstance: ActionCreator<SetOptionalMembersVnfGroupInstanceAction> = ( serviceId: string, path: string, vnfMembers: VnfMember[]) => ({
+  type: VnfGroupActions.SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE,
+  path: path,
+  serviceId: serviceId,
+  vnfMembers: vnfMembers
+});
+
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.spec.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.spec.ts
new file mode 100644 (file)
index 0000000..16c1c45
--- /dev/null
@@ -0,0 +1,140 @@
+import {VnfGroupInstance} from "../../../models/vnfGroupInstance";
+import {
+  CreateVnfGroupInstanceAction,
+  DeleteActionVnfGroupInstanceAction,
+  SetOptionalMembersVnfGroupInstanceAction,
+  UpdateVnfGroupInstanceAction,
+  VnfGroupActions
+} from "./vnfGroup.actions";
+import {vnfGroupReducer} from "./vnfGroup.reducers";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+import {VnfMember} from "../../../models/VnfMember";
+
+
+describe('vnfGroupReducer', () => {
+  test('#CREATE_VNF_GROUP_INSTANCE', () => {
+    let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance();
+    vnfGroupInstance.isMissingData = false;
+    vnfGroupInstance.instanceName = 'instanceName';
+    let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfGroups : {
+
+            }
+          }
+        }},
+      <CreateVnfGroupInstanceAction>{
+        type: VnfGroupActions.CREATE_VNF_GROUP_INSTANCE,
+        vnfGroupInstance : vnfGroupInstance,
+        vnfGroupStoreKey : null,
+        vnfGroupModelName : 'vnfGroupModelName',
+        serviceUuid : 'serviceModelId'
+      }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupModelName'];
+
+    expect(vnfGroupState).toBeDefined();
+    expect(vnfGroupState.isMissingData).toBeFalsy();
+  });
+
+  test('#UPDATE_VNF_GROUP_INSTANCE', () => {
+    let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance();
+    vnfGroupInstance.isMissingData = false;
+    vnfGroupInstance.instanceName = 'instanceName';
+    let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : {
+        'serviceModelId' : {
+          vnfGroups : {
+            'vnfGroupStoreKey' : {
+              isMissingData : true
+            }
+          }
+        }
+      }},
+      <UpdateVnfGroupInstanceAction>{
+        type: VnfGroupActions.UPDATE_VNF_GROUP_INSTANCE,
+        vnfGroupInstance : new VnfGroupInstance(),
+        vnfGroupStoreKey : 'vnfGroupStoreKey',
+        vnfGroupModelName : 'vnfGroupModelName',
+        serviceUuid : 'serviceModelId'
+      }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupStoreKey'];
+
+    expect(vnfGroupState).toBeDefined();
+    expect(vnfGroupState.isMissingData).toBeFalsy();
+  });
+
+  test('#DELETE_ACTION_VNF_GROUP_INSTANCE', () => {
+    let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance();
+    vnfGroupInstance.isMissingData = false;
+    vnfGroupInstance.instanceName = 'instanceName';
+    vnfGroupInstance.action = ServiceInstanceActions.None;
+    let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : {
+        'serviceModelId' : {
+          vnfGroups : {
+            'vnfGroupStoreKey' : {
+              isMissingData : true,
+              action : 'None'
+            }
+          }
+        }
+      }},
+      <DeleteActionVnfGroupInstanceAction>{
+        type: VnfGroupActions.DELETE_ACTION_VNF_GROUP_INSTANCE,
+        vnfGroupStoreKey: 'vnfGroupStoreKey',
+        serviceId: 'serviceModelId'
+      }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupStoreKey'];
+
+    expect(vnfGroupState).toBeDefined();
+    expect(vnfGroupState.action).toEqual(ServiceInstanceActions.None_Delete);
+  });
+
+  test('#UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE', () => {
+    let vnfGroupInstance: VnfGroupInstance = new VnfGroupInstance();
+    vnfGroupInstance.isMissingData = false;
+    vnfGroupInstance.instanceName = 'instanceName';
+    vnfGroupInstance.action = ServiceInstanceActions.None_Delete;
+    let vnfGroupState = vnfGroupReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfGroups : {
+              'vnfGroupStoreKey' : {
+                isMissingData : true,
+                action : 'None_Delete'
+              }
+            }
+          }
+        }},
+      <DeleteActionVnfGroupInstanceAction>{
+        type: VnfGroupActions.UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE,
+        vnfGroupStoreKey: 'vnfGroupStoreKey',
+        serviceId: 'serviceModelId'
+      }).serviceInstance['serviceModelId'].vnfGroups['vnfGroupStoreKey'];
+
+    expect(vnfGroupState).toBeDefined();
+    expect(vnfGroupState.action).toEqual(ServiceInstanceActions.None);
+  });
+
+  test('#SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE', () => {
+    let vnf1: VnfMember = new VnfMember();
+    vnf1.serviceInstanceId = 'aa';
+    vnf1.instanceId = 'aaa';
+    let vnf2: VnfMember = new VnfMember();
+    vnf2.serviceInstanceId = 'bb';
+    vnf2.instanceId = 'bbb';
+    let optionalGroupMembersMap = vnfGroupReducer(<any>{
+        serviceInstance: {
+          'serviceModelId': {
+            optionalGroupMembersMap : {}
+          }
+        }
+      },
+      <SetOptionalMembersVnfGroupInstanceAction>{
+        type: VnfGroupActions.SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE,
+        path: 'path1',
+        serviceId: 'serviceModelId',
+        vnfMembers: [vnf1, vnf2]
+      }).serviceInstance['serviceModelId'].optionalGroupMembersMap;
+
+    optionalGroupMembersMap['path1']= [vnf1, vnf2];
+    expect(optionalGroupMembersMap).toEqual({'path1':[vnf1, vnf2]});
+  });
+});
+
+
+
diff --git a/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.ts b/vid-webpack-master/src/app/shared/storeUtil/utils/vnfGroup/vnfGroup.reducers.ts
new file mode 100644 (file)
index 0000000..2923c09
--- /dev/null
@@ -0,0 +1,108 @@
+import {Action} from "redux";
+import {VnfGroupInstance} from "../../../models/vnfGroupInstance";
+import * as _ from "lodash";
+import {ServiceInstance} from "../../../models/serviceInstance";
+import {ServiceState} from "../main.reducer";
+import {
+  CreateVnfGroupInstanceAction,
+  DeleteActionVnfGroupInstanceAction, SetOptionalMembersVnfGroupInstanceAction,
+  UpdateVnfGroupInstanceAction,
+  VnfGroupActions
+} from "./vnfGroup.actions";
+import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
+
+export function vnfGroupReducer(state: ServiceState, action: Action): ServiceState {
+  switch (action.type) {
+    case VnfGroupActions.CREATE_VNF_GROUP_INSTANCE: {
+      const updateVnfGroupInstanceAction = <CreateVnfGroupInstanceAction>action;
+      const serviceUuid = updateVnfGroupInstanceAction.serviceUuid;
+      let vnfGroupModelName = updateVnfGroupInstanceAction.vnfGroupModelName;
+      let newState = _.cloneDeep(state);
+
+      updateVnfGroupInstanceAction.vnfGroupInstance.originalName = vnfGroupModelName;
+      updateVnfGroupInstanceAction.vnfGroupModelName = calculateNextUniqueModelName(vnfGroupModelName, serviceUuid, newState, 'vnfGroups');
+
+      let vnfGroupInstance: VnfGroupInstance = newState.serviceInstance[serviceUuid].vnfGroups[vnfGroupModelName];
+      vnfGroupInstance = new VnfGroupInstance();
+      updateVnfGroupInstanceAction.vnfGroupInstance.vnfGroupStoreKey = updateVnfGroupInstanceAction.vnfGroupModelName;
+      updateVnfGroupInstanceAction.vnfGroupInstance.originalName = vnfGroupModelName;
+      vnfGroupInstance.originalName = updateVnfGroupInstanceAction.vnfGroupInstance.originalName;
+      vnfGroupInstance.vnfGroupStoreKey = updateVnfGroupInstanceAction.vnfGroupInstance.vnfGroupStoreKey;
+      updateServiceValidationCounter(newState, vnfGroupInstance['isMissingData'], updateVnfGroupInstanceAction.vnfGroupInstance['isMissingData'], serviceUuid);
+
+      newState.serviceInstance[serviceUuid].vnfGroups[updateVnfGroupInstanceAction.vnfGroupModelName] = Object.assign(vnfGroupInstance, updateVnfGroupInstanceAction.vnfGroupInstance);
+      return newState;
+    }
+    case VnfGroupActions.UPDATE_VNF_GROUP_INSTANCE: {
+      const updateVnfInstanceAction = <UpdateVnfGroupInstanceAction>action;
+      const serviceUuid = updateVnfInstanceAction.serviceUuid;
+      let vnfGroupStoreKey = updateVnfInstanceAction.vnfGroupStoreKey;
+
+
+      let newState = _.cloneDeep(state);
+      let vnfGroupInstance: VnfGroupInstance = newState.serviceInstance[serviceUuid].vnfGroups[vnfGroupStoreKey];
+      updateUniqueNames(vnfGroupInstance ? vnfGroupInstance.instanceName : null, updateVnfInstanceAction.vnfGroupInstance.instanceName, newState.serviceInstance[serviceUuid]);
+
+      vnfGroupInstance = vnfGroupInstance || new VnfGroupInstance();
+      updateServiceValidationCounter(newState, vnfGroupInstance['isMissingData'], updateVnfInstanceAction.vnfGroupInstance['isMissingData'], serviceUuid);
+
+      newState.serviceInstance[serviceUuid].vnfGroups[vnfGroupStoreKey] = Object.assign(vnfGroupInstance, updateVnfInstanceAction.vnfGroupInstance);
+      return newState;
+    }
+    case VnfGroupActions.DELETE_ACTION_VNF_GROUP_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let oldAction = newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action;
+      if(oldAction === ServiceInstanceActions.None_Delete || oldAction === ServiceInstanceActions.Update_Delete) return newState;
+      newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action = (oldAction + '_Delete') as ServiceInstanceActions;
+      return newState;
+    }
+    case VnfGroupActions.UNDO_DELETE_ACTION_VNF_GROUP_INSTANCE : {
+      let newState = _.cloneDeep(state);
+      let oldState = newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action;
+      newState.serviceInstance[(<DeleteActionVnfGroupInstanceAction>action).serviceId].vnfGroups[(<DeleteActionVnfGroupInstanceAction>action).vnfGroupStoreKey].action = (oldState.split('_')[0]) as ServiceInstanceActions;
+      return newState;
+    }
+    case VnfGroupActions.SET_OPTIONAL_MEMBERS_VNF_GROUP_INSTANCE:{
+      let newState = _.cloneDeep(state);
+      newState.serviceInstance[(<SetOptionalMembersVnfGroupInstanceAction>action).serviceId].optionalGroupMembersMap[(<SetOptionalMembersVnfGroupInstanceAction>action).path] = (<SetOptionalMembersVnfGroupInstanceAction>action).vnfMembers;
+      return newState;
+    }
+  }
+}
+
+const updateServiceValidationCounter = (newState: any, oldValidationState: boolean, newValidationState: boolean, serviceUuid: string) => {
+  if (oldValidationState && !newValidationState) {
+    newState.serviceInstance[serviceUuid].validationCounter--;
+  } else if (!oldValidationState && newValidationState) {
+    newState.serviceInstance[serviceUuid].validationCounter++;
+  }
+};
+
+
+const updateUniqueNames = (oldName: string, newName: string, serviceInstance: ServiceInstance): void => {
+  let existingNames = serviceInstance.existingNames;
+  if (!_.isNil(oldName) && oldName.toLowerCase() in existingNames) {
+    delete existingNames[oldName.toLowerCase()];
+  }
+  if (!_.isNil(newName)) {
+    existingNames[newName.toLowerCase()] = "";
+  }
+};
+
+
+export const calculateNextUniqueModelName = (vnfGroupModelName: string, serviceId: string, state: any, levelName: string): string => {
+  let counter: number = null;
+  while (true) {
+    let pattern = !_.isNil(counter) ? ("_" + counter) : "";
+    if (!_.isNil(state.serviceInstance[serviceId][levelName][vnfGroupModelName + pattern])) {
+      counter = counter ? (counter + 1) : 1;
+    } else {
+      return vnfGroupModelName + pattern;
+    }
+  }
+};
+
+
+
+
+
index c78e12e..f69517c 100644 (file)
@@ -34,9 +34,10 @@ export module Constants {
     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_SERVICE_INSTANCE_TOPOLOGY_PATH = '../../aai_get_service_instance_topology/';
+    public static AAI_GET_SERVICE_GROUP_MEMBERS_PATH = '../../aai_search_group_members/';
     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';
@@ -87,10 +88,12 @@ export module Constants {
     public static WELCOME_PATH = 'welcome.htm';
     public static IS_PERMITTED_SUB_PATH = '&isPermitted=';
     public static SERVICES_JOB_INFO_PATH = '../../asyncInstantiation';
+    public static SERVICES_RETRY_TOPOLOGY = '../../asyncInstantiation/bulkForRetry';
     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";
+    public static AUDIT_STATUS_FOR_RETRY_PATH = '../../asyncInstantiation/auditStatusForRetry';
 
     // Test Environment Urls =
     public static OPERATIONAL_ENVIRONMENT_CREATE = 'operationalEnvironment/create';
@@ -284,4 +287,8 @@ export module Constants {
   export class AuditInfoModal{
     public static TITLE = 'Service Instantiation Information';
   }
+
+  export class LegacyRegion {
+    public static MEGA_REGION = ['JANET25'];
+  }
 }
index be9ade0..daa31a3 100644 (file)
@@ -1,19 +1,19 @@
-import { Injectable } from '@angular/core';
-import {
-  HttpInterceptor,
-  HttpRequest,
-  HttpHandler,
-  HttpEvent, HttpErrorResponse
-} from '@angular/common/http';
+import {Injectable} from '@angular/core';
+import {HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} 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';
+import {Observable} from 'rxjs';
+import {ErrorMessage, ErrorService} from '../../components/error/error.component.service';
+import {SpinnerComponent, SpinnerInfo} from '../../components/spinner/spinner.component';
+import {of} from "rxjs";
 
 @Injectable()
 export class HttpInterceptorService implements HttpInterceptor {
   intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
-    SpinnerComponent.showSpinner.next(true);
+    if (request.headers.get('x-show-spinner') !== false.toString()) {
+      let spinnerInfo : SpinnerInfo = new SpinnerInfo(true, request.url, request.responseType);
+      SpinnerComponent.showSpinner.next(spinnerInfo);
+    }
+
     return next.handle(request)
       .catch((err: HttpErrorResponse) => {
         if (err.status === 500) {
@@ -21,11 +21,12 @@ export class HttpInterceptorService implements HttpInterceptor {
             'It appears that one of the backend servers is not responding.\n Please try later.',
             500);
           ErrorService.showErrorWithMessage(errorMessage);
-          return Observable.of(null);
+          return of(null);
         }
         return Observable.throw(err);
       }).finally(() => {
-        SpinnerComponent.showSpinner.next(false);
+        let spinnerInfo : SpinnerInfo = new SpinnerInfo(false, request.url, request.responseType);
+        SpinnerComponent.showSpinner.next(spinnerInfo);
       });
   }
 }
index ea0eb04..15a840f 100644 (file)
@@ -1,16 +1,24 @@
 
 
 import {LogService} from "./log.service";
+import {TestBed} from "@angular/core/testing";
 
 describe('log service service', () => {
+
   let logService : LogService;
 
-  beforeEach(() => {
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+
+    });
+    await TestBed.compileComponents();
     logService = new LogService();
-  });
 
 
-  it('check all ILogger function are defined', ()=>{
+  })().then(done).catch(done.fail));
+
+
+  test('check all ILogger function are defined', ()=>{
     expect(logService.log).toBeDefined();
     expect(logService.assert).toBeDefined();
     expect(logService.error).toBeDefined();
@@ -20,10 +28,40 @@ describe('log service service', () => {
     expect(logService.warn).toBeDefined();
   });
 
-  it('test getPrefixLog function', ()=> {
+  test('test getPrefixLog function: with data', ()=> {
     let args = ['message', [1,2,3,4,5]];
     let result  = LogService.getPrefixLog(args);
     expect(result).toBeDefined();
   });
 
+  test('log assert', ()=> {
+    jest.spyOn(console, 'assert');
+    logService.assert('someArg');
+    expect(console.assert).toHaveBeenCalled();
+  });
+
+  test('log group', ()=> {
+    jest.spyOn(console, 'group');
+    logService.group('someArg');
+    expect(console.group).toHaveBeenCalled();
+  });
+
+  test('log groupEnd', ()=> {
+    jest.spyOn(console, 'groupEnd');
+    logService.groupEnd('someArg');
+    expect(console.groupEnd).toHaveBeenCalled();
+  });
+
+  test('log log', ()=> {
+    jest.spyOn(console, 'log');
+    logService.log('someArg');
+    expect(console.log).toHaveBeenCalled();
+  });
+
+  test('log warn', ()=> {
+    spyOn(console, 'warn');
+    logService.warn('someArg');
+    expect(console.warn).toHaveBeenCalled();
+  });
+
 });
diff --git a/vid-webpack-master/src/app/shared/utils/util.spec.ts b/vid-webpack-master/src/app/shared/utils/util.spec.ts
new file mode 100644 (file)
index 0000000..2f9142f
--- /dev/null
@@ -0,0 +1,31 @@
+import {Utils} from "./utils";
+import {TestBed} from "@angular/core/testing";
+
+
+describe('Util', () => {
+  let util: Utils;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+
+    });
+    await TestBed.compileComponents();
+
+    util = new Utils();
+
+  })().then(done).catch(done.fail));
+
+  test('should be defined', () => {
+    expect(util).toBeDefined();
+  });
+
+  test('hasContents should return false if object is undefined or null or empty', () => {
+    expect(Utils.hasContents(undefined)).toBeFalsy();
+    expect(Utils.hasContents(null)).toBeFalsy();
+    expect(Utils.hasContents("")).toBeFalsy();
+  });
+
+  test('hasContents should return true if object is not undefined and not null and not empty', () => {
+    expect(Utils.hasContents("someValue")).toBeTruthy();
+  });
+});
similarity index 97%
rename from vid-webpack-master/src/app/utils/utils.ts
rename to vid-webpack-master/src/app/shared/utils/utils.ts
index dc4db3e..d63a3c9 100644 (file)
@@ -1,5 +1,3 @@
-import { Constants } from '../shared/utils/constants';
-import Parameter = Constants.Parameter;
 import * as _ from 'lodash'
 
 export class Utils {
@@ -196,8 +194,6 @@ export class Utils {
     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,
diff --git a/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.spec.ts b/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.spec.ts
new file mode 100644 (file)
index 0000000..35d3c48
--- /dev/null
@@ -0,0 +1,41 @@
+import {FormControl, ValidatorFn} from "@angular/forms";
+import {CustomValidators} from "./uniqueName.validator";
+import {FileUnit} from "../../components/formControls/component/file/fileUnit.enum";
+
+
+describe('Custom Validator Functions', () => {
+  test('isValidJson Validator should return null when value is valid and correct object when invalid', () => {
+
+    let isValidJsonFunction: ValidatorFn = CustomValidators.isValidJson();
+
+    expect(isValidJsonFunction(new FormControl("{ 'key': 'value', 'array': ['first',]}"))).toEqual({ isValidJson: true });
+
+    expect(isValidJsonFunction(new FormControl('{ "key": "value", "array": ["first"]'))).toEqual({ isValidJson: true });
+
+    expect(isValidJsonFunction(new FormControl('{ "key": "value", "array": ["first"]}'))).toEqual(null);
+
+    expect(isValidJsonFunction(new FormControl('{ "key": "value", "array": "first"}'))).toEqual(null);
+  });
+
+  test('isStringContainTags Validator should return null when value is valid and correct object when invalid', () => {
+
+    const isStringContainTagsFunction: ValidatorFn = CustomValidators.isStringContainTags();
+
+    expect(isStringContainTagsFunction(new FormControl('<asdf>'))).toEqual({isStringContainTags : true});
+
+    expect(isStringContainTagsFunction(new FormControl('1234<asfd56'))).toEqual(null);
+  });
+
+  test('isFileTooBig Validator should return null when value is valid and correct object when invalid', () => {
+
+    let isFileTooBigFunction: ValidatorFn = CustomValidators.isFileTooBig(FileUnit.MB, 5);
+
+    expect(isFileTooBigFunction(new FormControl({ size: 6000001 }))).toEqual({ isFileTooBig: true });
+
+    expect(isFileTooBigFunction(new FormControl({ size: 4000000}))).toEqual(null);
+
+    isFileTooBigFunction = CustomValidators.isFileTooBig(FileUnit.B, 5);
+
+    expect(isFileTooBigFunction(new FormControl({ size: 4000000}))).toEqual({ isFileTooBig: true });
+  })
+});
diff --git a/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.ts b/vid-webpack-master/src/app/shared/validators/uniqueName/uniqueName.validator.ts
new file mode 100644 (file)
index 0000000..4d3e383
--- /dev/null
@@ -0,0 +1,100 @@
+import {AbstractControl, ValidatorFn} from "@angular/forms";
+import {Injectable} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {FileUnit} from "../../components/formControls/component/file/fileUnit.enum";
+import * as _ from 'lodash';
+
+@Injectable()
+export class CustomValidators {
+  static uniqueInstanceNameValidator(...args): ValidatorFn {
+    const store : NgRedux<AppState> = args[0];
+    const serviceId : string = args[1];
+    const originalName : string = args[2];
+    return (control: AbstractControl): {[key: string]: any} | null => {
+      const name = control.value;
+      if(name && name !== originalName) {
+        const result: boolean = CustomValidators.isUnique(store.getState().service.serviceInstance, serviceId, name, name === originalName);
+        if(!result){
+          return {
+            uniqueInstanceNameValidator : true
+          };
+        }else {
+          return null;
+        }
+      }
+      return null;
+    };
+  }
+
+  static isUnique(serviceInstance : any, serviceId : string, name: string, isEqualToOriginalInstanceName : boolean) : boolean {
+    const service = serviceInstance[serviceId];
+    if(service){
+      const existingNames = service.existingNames;
+      if(_.includes(existingNames, name)) return false;
+    }
+    return true;
+  }
+
+  static isStringContainHtmlTag(str: string): boolean{
+    var regex = RegExp("<[^>]*>");
+    return regex.test(str);
+  }
+
+  static isValidJson() : ValidatorFn {
+    return (control: AbstractControl): {[key: string]: any} | null => {
+      const content = control.value;
+      let invalid: boolean = false;
+      if (content)  {
+        try {
+          JSON.parse(content);
+        } catch (e) {
+          invalid = true;
+        }
+      }
+      return (invalid) ? {isValidJson : true} : null;
+    }
+  }
+
+  static isStringContainTags() : ValidatorFn {
+    return (control: AbstractControl): {[key: string]: any} | null => {
+      const content = control.value;
+      let invalid: boolean = false;
+      if (content)  {
+          invalid = CustomValidators.isStringContainHtmlTag(content);
+      }
+      return (invalid) ? {isStringContainTags : true} : null;
+    }
+  }
+
+  static isFileTooBig(...args) : ValidatorFn {
+    const unit : FileUnit = args[0];
+    const size : number = args[1];
+    return (control: AbstractControl): {[key: string]: any} | null => {
+      const file = control.value;
+      let sizeToByte: number;
+      if (file) {
+        switch (unit)  {
+          case FileUnit.b:
+            sizeToByte = 1/8;
+            break;
+          case FileUnit.B:
+            sizeToByte = 1;
+            break;
+          case FileUnit.KB:
+            sizeToByte = 1000;
+            break;
+          case FileUnit.MB:
+            sizeToByte = 1000000;
+            break;
+          default:
+            sizeToByte = 0;
+            break;
+
+        }
+        return (file.size > (sizeToByte * size)) ? {isFileTooBig: true} : null;
+      }
+      return null;
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/store/module.ts b/vid-webpack-master/src/app/store/module.ts
deleted file mode 100644 (file)
index c0909c1..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-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
deleted file mode 100644 (file)
index b3e4f47..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-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/support/support.component.ts b/vid-webpack-master/src/app/support/support.component.ts
new file mode 100644 (file)
index 0000000..a065e8a
--- /dev/null
@@ -0,0 +1,20 @@
+import {Component} from '@angular/core';
+
+@Component({
+  selector: 'app-support',
+  template: `
+    <ul>
+      <li><a href="../../version">Version</a></li>
+      <li><a href="../../flags">Feature Flags</a></li>
+      <li><a href="#/healthStatus">Probe</a></li>
+      <li>
+        <form action="../../rest/models/reset" method="post">
+            <button name="upvote" value="Upvote"></button>
+        </form>
+      </li>
+    </ul>
+  `,
+})
+
+export class SupportComponent {
+}
@@ -1,16 +1,20 @@
 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 {NgRedux, select} from '@angular-redux/store';
+import {Observable} from "rxjs";
+import {AppState} from "../../shared/store/reducers";
 import {
-  loadProductFamiliesAction, loadLcpTenant, loadAicZones,
-  loadCategoryParameters
-} from '../../services/aaiService/aai.actions';
-import { LcpRegionsAndTenants } from "../../shared/models/lcpRegionsAndTenants";
+  loadAicZones,
+  loadCategoryParameters,
+  loadLcpTenant,
+  loadProductFamiliesAction
+} from '../../shared/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";
+import {Tenant} from "../../shared/models/tenant";
+import {FormAsyncService} from "./form-async.service";
+import {AaiService} from "../../shared/services/aaiService/aai.service";
 
 @Component({
   selector: "formasync",
@@ -19,16 +23,21 @@ import {VNFModel} from "../../shared/models/vnfModel";
 
 })
 
-export class formasync implements OnInit {
+export class Formasync implements OnInit {
 
-  constructor(private store: NgRedux<AppState>) { }
+  constructor(private store: NgRedux<AppState>, private _formAsyncService: FormAsyncService) { }
 
   @ViewChild('form') form: NgForm;
-
+  @Input()
+  set params(params: any) {
+    if (params) {
+      this.paramsInfo = params;
+    }
+  }
   @Input()
   set model(model: VNFModel) {
     if (model) {
-      this.isUserProvidedNaming = model.isUserProvidedNaming;
+      this.isEcompGeneratedNaming = model.isEcompGeneratedNaming;
     }
   };
 
@@ -54,26 +63,39 @@ export class formasync implements OnInit {
     new SelectOption({id: 'true', name: 'Rollback'}),
     new SelectOption({id: 'false', name: 'Don\'t Rollback'})
   ];
-  tenants = [];
+  tenants: Tenant[] = [];
 
   serviceInstance: any = {
+    cloudOwner: null,
     rollback:'true'
   };
 
-  isUserProvidedNaming: boolean = false;
+  isEcompGeneratedNaming: boolean = true;
+  paramsInfo : any;
 
   onLcpSelect(newValue: string) {
     let value: LcpRegionsAndTenants = undefined;
     this.lcpRegionsAndTenants.subscribe(data => value = data);
     this.tenants = value.lcpRegionsTenantsMap[newValue];
+    this.serviceInstance.tenantId = undefined;
+  }
+
+
+
+  onTenantSelect(newValue: string) {
+    this.serviceInstance.cloudOwner = this._formAsyncService.onTenantSelect(this.tenants, newValue);
   }
 
   ngOnInit() {
     this.store.dispatch(loadProductFamiliesAction());
-    this.store.dispatch(loadLcpTenant());
+    this.store.dispatch(loadLcpTenant(this.paramsInfo['globalCustomerId'], this.paramsInfo['serviceType']));
     this.store.dispatch(loadAicZones());
     this.store.dispatch(loadCategoryParameters());
   }
+
+  public formatCloudOwnerTrailer(cloudOwner: string):string {
+    return AaiService.formatCloudOwnerTrailer(cloudOwner);
+  }
 }
 
 
diff --git a/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.spec.ts b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.spec.ts
new file mode 100644 (file)
index 0000000..0f7d444
--- /dev/null
@@ -0,0 +1,31 @@
+import {async, getTestBed, TestBed} from '@angular/core/testing';
+import {FormAsyncService} from "./form-async.service";
+
+describe('FormAsyncService', () => {
+
+  let injector;
+  let service: FormAsyncService;
+
+  beforeAll(done => (async () => {
+    TestBed.configureTestingModule({
+      providers: [FormAsyncService]
+    });
+    await TestBed.compileComponents();
+
+    injector = getTestBed();
+    service = injector.get(FormAsyncService);
+
+  })().then(done).catch(done.fail));
+
+  test('should add cloudOwner according to new tenant value', () => {
+    const tenants = [{'id': '1', 'name': 'firstTenant', 'isPermitted': true, cloudOwner: 'irma-aic'},
+      {'id': '2', 'name': 'secondTenant', 'isPermitted': true, cloudOwner: 'irma-aic2'}];
+    let cloudOwner: string;
+    cloudOwner = service.onTenantSelect(tenants,'1');
+    expect(cloudOwner).toEqual('irma-aic');
+
+    cloudOwner = service.onTenantSelect(tenants, '2');
+    expect(cloudOwner).toEqual('irma-aic2');
+  })
+
+});
diff --git a/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.ts b/vid-webpack-master/src/app/vlanTagging/form-async/form-async.service.ts
new file mode 100644 (file)
index 0000000..f5a33fe
--- /dev/null
@@ -0,0 +1,12 @@
+import {Injectable} from '@angular/core';
+import {Tenant} from "../../shared/models/tenant";
+
+@Injectable()
+export class FormAsyncService {
+  constructor(){}
+
+  public onTenantSelect(tenants: Tenant[], newValue: string) {
+    let tenantTemp: Tenant[] = tenants.filter(tenant => tenant.id == newValue);
+    return tenantTemp[0] && tenantTemp[0].cloudOwner;
+  }
+}
@@ -1,6 +1,6 @@
 <div class="content">
   <form #form="ngForm" name="networkNodeForm" class="form-wrapper">
-    <div *ngIf="isUserProvidedNaming" class="details-item">
+    <div  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>
       <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>
+        <option *ngFor="let lcpRegion of lcpRegions | async" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}{{formatCloudOwnerTrailer(lcpRegion.cloudOwner)}}</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"
+      <select (change)="onTenantSelect($event.target.value)" 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>
index 46a1769..d3df926 100644 (file)
@@ -1,8 +1,8 @@
 import {Component, Input, OnInit, ViewChild} from "@angular/core";
 import {NgRedux, select} from "@angular-redux/store";
-import {AppState} from "../../store/reducers";
+import {AppState} from "../../shared/store/reducers";
 import {ModelInformationItem} from "../../shared/components/model-information/model-information.component";
-import {Observable} from "rxjs/Observable";
+import {Observable} from "rxjs";
 import {NgForm} from "@angular/forms";
 import * as _ from 'lodash';
 
index f474f4b..5443a25 100644 (file)
@@ -9,7 +9,7 @@
   <span (serviceInstamce)="onServiceInstanceChange($event)"></span>
   <div class="content-wrapper">
     <div class="left-side">
-      <formasync [hidden]="currentStep === wizardSteps.two" [model]="model" class="form"></formasync>
+      <formasync [hidden]="currentStep === wizardSteps.two" [params]="params"  [model]="model" class="form"></formasync>
       <app-network-selector [hidden]="currentStep === wizardSteps.one" class="form-wrapper" [groups]="groups"></app-network-selector>
     </div>
 
index f3f63e1..87f1172 100644 (file)
@@ -1,19 +1,17 @@
-import {formasync} from './../components/form-async/form-async.component';
+import {Formasync} from './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 {AppState} from "../shared/store/reducers";
 import {ActivatedRoute} from "@angular/router";
-import {
-  loadServiceAccordingToUuid, loadAaiNetworkAccordingToNetworkCF,
-  loadUserId
-} from "../services/aaiService/aai.actions";
+import {loadServiceAccordingToUuid, loadAaiNetworkAccordingToNetworkCF, loadUserId} from "../shared/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";
+import {Observable} from "rxjs";
+import {RootEpics} from "../shared/store/epics";
+import * as _ from "lodash";
 
 enum WizardSteps {
   one,
@@ -33,12 +31,15 @@ const buttonTextCancel = "Cancel";
 
 export class VlanTaggingComponent implements OnInit {
   constructor(private store: NgRedux<AppState>,
-              private route: ActivatedRoute) {
+              private route: ActivatedRoute,
+              rootEpics: RootEpics) {
     this.nextButtonText = buttonTextNext;
     this.cancelButtonText = buttonTextCancel;
     this.currentStep = WizardSteps.one;
+    rootEpics.createEpics();
   }
 
+  subscriberId: string;
   subscriberName: string;
   serviceKey: string;
   serviceType: string;
@@ -47,11 +48,11 @@ export class VlanTaggingComponent implements OnInit {
   serviceModelId: string;
   modelInfoItems: Array<ModelInformationItem>;
   groups: Array<Array<ModelInformationItem>>;
+  params : any;
   currentStep: WizardSteps;
   nextButtonText: string;
   cancelButtonText: string;
   wizardSteps = WizardSteps;
-  cloudOwner: string;
   cloudRegionId: string;
   serviceInstanceId : string;
   model: VNFModel;
@@ -72,8 +73,8 @@ export class VlanTaggingComponent implements OnInit {
 
   @ViewChild(NetworkSelectorComponent)
   public networkSelectorComponent: NetworkSelectorComponent;
-  @ViewChild(formasync)
-  public formAsync: formasync;
+  @ViewChild(Formasync)
+  public formAsync: Formasync;
 
 
   deploySubInterface() {
@@ -101,15 +102,15 @@ export class VlanTaggingComponent implements OnInit {
     this.store.dispatch(loadUserId());
     this.userIdObs.subscribe(res => this.userId = res);
     this.route.queryParams.subscribe(params => {
+      this.params = params;
       this.serviceModelId = params["serviceModelId"];
-      this.subscriberName = params["subscriberName"];
+      this.subscriberId = params["globalCustomerId"];
       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;
@@ -143,7 +144,7 @@ export class VlanTaggingComponent implements OnInit {
         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)
+            loadAaiNetworkAccordingToNetworkCF(networkName["values"][0], this.formAsync.serviceInstance.cloudOwner, this.formAsync.serviceInstance.lcpRegion)
           );
         });
         this.currentStep = WizardSteps.two;
index 3227542..c384899 100644 (file)
@@ -1,5 +1,4 @@
-
-import { formasync } from './../components/form-async/form-async.component';
+import { Formasync } from './form-async/form-async.component';
 import {NgModule,} from '@angular/core';
 import { FormsModule } from '@angular/forms';
 import { VlanTaggingComponent } from './vlan-tagging.component';
@@ -9,11 +8,9 @@ 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';
-
-
+import {FormAsyncService} from "./form-async/form-async.service";
 
 @NgModule({
-
 imports: [
     CommonModule,
     NgReduxModule,
@@ -23,11 +20,10 @@ imports: [
     SharedModule.forRoot()
 
   ],
-  providers: [  ],
-  declarations: [VlanTaggingComponent,formasync,NetworkSelectorComponent],
+  providers: [ FormAsyncService ],
+  declarations: [VlanTaggingComponent, Formasync, NetworkSelectorComponent],
   entryComponents: [],
-  exports: [formasync]
-
+  exports: [Formasync]
 })
 
 export class VlanTaggingModule { }
diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.routing.ts b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.routing.ts
new file mode 100644 (file)
index 0000000..d89c9be
--- /dev/null
@@ -0,0 +1,19 @@
+import {Route} from "@angular/router";
+import {FlagsResolve} from "../shared/resolvers/flag/flag.resolver";
+import {VlanTaggingComponent} from "./vlan-tagging.component";
+
+export const VlanTaggingRoutes: Route[] = [
+  {
+    path: 'vlan',
+    children: [
+      {
+        path: '',
+        component: VlanTaggingComponent,
+        resolve: {
+          flags: FlagsResolve
+        },
+      }
+    ]
+  }
+];
+
diff --git a/vid-webpack-master/src/assets/img/X_o.svg b/vid-webpack-master/src/assets/img/X_o.svg
deleted file mode 100644 (file)
index a323c19..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<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/indesign.svg b/vid-webpack-master/src/assets/img/indesign.svg
new file mode 100644 (file)
index 0000000..b7eae4a
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
+    <title>indesign</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="indesign" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <path d="M19.0000997,7.95245109 L12.8669581,14.0997796 L12.7942927,14.1720695 C12.648962,14.3889392 12.430966,14.6780988 12.3583006,14.8949686 L10.9219369,19.5341091 C10.7766062,19.8232687 11.139933,20.1847183 11.4305944,20.0401384 L16.1368992,18.6540439 C16.3548953,18.5094641 16.6455567,18.3648842 16.8635528,18.1480145 C16.8635528,18.0757246 16.9362181,18.0757246 16.9362181,18.0757246 L19.0000997,16.0225067 L19.0000997,17.0177512 L19.0000997,21 C19.0000997,22.1045695 18.1046692,23 17.0000997,23 L3,23 C1.8954305,23 1,22.1045695 1,21 L1,3 C1,1.8954305 1.8954305,1 3,1 L17.0000997,1 C18.1046692,1 19.0000997,1.8954305 19.0000997,3 L19.0000997,7.95245109 Z M4.89539641,4.00004796 C4.34311166,4.00004796 3.89539641,4.44776321 3.89539641,5.00005288 C3.89539641,5.55233763 4.34311166,6.00005288 4.89539641,6.00005288 L14.9203654,6.00005288 C15.4726501,6.00005288 15.9203654,5.55233763 15.9203654,5.00004796 C15.9203654,4.44776321 15.4726501,4.00004796 14.9203654,4.00004796 L4.89539641,4.00004796 Z M4.89539641,9.00012789 C4.34311166,9.00012789 3.89539641,9.44784314 3.89539641,10.0001328 C3.89539641,10.5524176 4.34311166,11.0001328 4.89539641,11.0001328 L11.9203488,11.0001328 C12.4726335,11.0001328 12.9203488,10.5524176 12.9203488,10.0001279 C12.9203488,9.44784314 12.4726335,9.00012789 11.9203488,9.00012789 L4.89539641,9.00012789 Z M19.9145829,8.52401209 L22.4846419,11.0807921 L16.3807518,17.1531445 C16.3807518,17.1531445 16.3348579,17.1531445 16.3348579,17.1988013 C16.1971762,17.3357716 16.0136006,17.4270852 15.8759188,17.5183988 L12.3420878,18.9794159 C12.1585121,19.0707295 11.9290426,18.8424455 12.0208304,18.6598184 L13.4894355,15.1442459 C13.5353294,15.0072756 13.6730112,14.8246484 13.764799,14.6876781 L13.8106929,14.6420213 L19.9145829,8.52401209 Z M23.6319896,8.15875781 C24.0909287,8.66098244 24.1368226,9.43714779 23.6778835,9.89371564 L22.9894749,10.5785674 L20.4194159,8.02178745 L21.1078246,7.33693567 C21.5667637,6.88036782 22.3469602,6.88036782 22.8517932,7.38259246 L23.6319896,8.15875781 Z" id="Combined-Shape" fill="#5A5A5A"></path>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/vid-webpack-master/src/assets/img/inprogress.svg b/vid-webpack-master/src/assets/img/inprogress.svg
deleted file mode 100644 (file)
index b893c62..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<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
deleted file mode 100644 (file)
index f1f9b79..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<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
deleted file mode 100644 (file)
index 78c9960..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<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/plus-circle.svg b/vid-webpack-master/src/assets/img/plus-circle.svg
new file mode 100644 (file)
index 0000000..8777317
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
+<title>plus-circle </title>
+<desc>Created with Sketch.</desc>
+<defs>
+  <path d="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 M16,11 L13,11 L13,8 C13,7.4 12.6,7 12,7 C11.4,7 11,7.4 11,8 L11,11 L8,11 C7.4,11 7,11.4 7,12 C7,12.6 7.4,13 8,13 L11,13 L11,16 C11,16.6 11.4,17 12,17 C12.6,17 13,16.6 13,16 L13,13 L16,13 C16.6,13 17,12.6 17,12 C17,11.4 16.6,11 16,11" id="path-1"></path>
+</defs>
+<g id="plus-circle-" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+  <mask id="mask-2" fill="white">
+    <use xlink:href="#path-1"></use>
+  </mask>
+  <use id="Mask" fill="#000000" xlink:href="#path-1"></use>
+</g>
+</svg>
diff --git a/vid-webpack-master/src/assets/img/stoped.svg b/vid-webpack-master/src/assets/img/stoped.svg
deleted file mode 100644 (file)
index 0198f15..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<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
deleted file mode 100644 (file)
index 72d75ae..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<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/assets/img/vid-logo.jpg b/vid-webpack-master/src/assets/img/vid-logo.jpg
new file mode 100644 (file)
index 0000000..68c16f0
Binary files /dev/null and b/vid-webpack-master/src/assets/img/vid-logo.jpg differ
index f3c3a91..c31fc94 100644 (file)
@@ -6,7 +6,7 @@
   <link rel="icon" type="image/x-icon" href="./assets/img/favicon.ico">
   <base href="./">
 </head>
-<body>
-<vid-app>Loading..</vid-app>
+<body style="height: 101%;">
+  <vid-app >Loading..</vid-app>
 </body>
 </html>
diff --git a/vid-webpack-master/src/jest.config.js b/vid-webpack-master/src/jest.config.js
new file mode 100644 (file)
index 0000000..f72ad24
--- /dev/null
@@ -0,0 +1,45 @@
+module.exports = {
+  collectCoverageFrom: ['src/**/*.{js,jsx}'],
+  coveragePathIgnorePatterns: [
+    '<rootDir>/node_modules/',
+    '<rootDir>/src/core/server/webpack-isomorphic-tools-config.js',
+    '<rootDir>/src/locale/',
+  ],
+  "reporters": [ "default", "jest-junit" ],
+  moduleDirectories: [
+    'src',
+    'node_modules',
+  ],
+  moduleFileExtensions: [
+    'js',
+    'json',
+    'jsx',
+  ],
+  moduleNameMapper: {
+    // Prevent un-transpiled react-photoswipe code being required.
+    '^photoswipe$': '<rootDir>/node_modules/photoswipe',
+    // Use the client-side logger by default for tests.
+    '^core/logger$': '<rootDir>/src/core/client/logger',
+    // Alias tests for tests to be able to import helpers.
+    '^tests/(.*)$': '<rootDir>/tests/$1',
+    // Replaces the following formats with an empty module.
+    '^.+\\.(scss|css|svg|woff|woff2|mp4|webm)$': '<rootDir>/tests/emptyModule',
+  },
+  setupFilesAfterEnv: ["<rootDir>/src/setupJest.ts"],
+  testPathIgnorePatterns: [
+    '<rootDir>/node_modules/',
+    '<rootDir>/(assets|bin|config|coverage|dist|docs|flow|locale|src)/',
+  ],
+  testMatch: [
+    '**/[Tt]est(*).js?(x)',
+    '**/__tests__/**/*.js?(x)',
+  ],
+  transform: {
+    "^.+\\.(ts|html)$": "<rootDir>/node_modules/jest-preset-angular/preprocessor.js",
+    "^.+\\.js$": "babel-jest"
+  },
+  transformIgnorePatterns: [
+    '<rootDir>/node_modules/',
+  ],
+  verbose: false,
+};
diff --git a/vid-webpack-master/src/jestGlobalMocks.ts b/vid-webpack-master/src/jestGlobalMocks.ts
new file mode 100644 (file)
index 0000000..5486d7c
--- /dev/null
@@ -0,0 +1,15 @@
+const mock = () => {
+  let storage = {};
+  return {
+    getItem: key => key in storage ? storage[key] : null,
+    setItem: (key, value) => storage[key] = value || '',
+    removeItem: key => delete storage[key],
+    clear: () => storage = {},
+  };
+};
+
+Object.defineProperty(window, 'localStorage', {value: mock()});
+Object.defineProperty(window, 'sessionStorage', {value: mock()});
+Object.defineProperty(window, 'getComputedStyle', {
+  value: () => ['-webkit-appearance']
+});
index 5a639ca..03fa7b9 100644 (file)
@@ -4,11 +4,12 @@
   <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" />
+  <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>
+  <vid-app>Loading..</vid-app>
 </body>
 </html>
diff --git a/vid-webpack-master/src/setupJest.ts b/vid-webpack-master/src/setupJest.ts
new file mode 100644 (file)
index 0000000..4568980
--- /dev/null
@@ -0,0 +1,2 @@
+import 'jest-preset-angular';
+import './jestGlobalMocks'
index dbcf7b6..8f6059d 100644 (file)
@@ -1,6 +1,6 @@
 // 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 "../app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree";
+@import "../app/drawingBoard/service-planning/available-models-tree/available-models-tree.component";
 
 @font-face {
   font-family: OpenSans-Bold;
index 905c795..9b490cd 100644 (file)
@@ -1,9 +1,9 @@
 /* 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";
+@import "app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree";
+@import "app/drawingBoard/service-planning/available-models-tree/available-models-tree.component";
+@import "../node_modules/onap-ui-common/lib/style.css";
 //body {
 //  [ui-view="content"] {
 //    height: 100%;
@@ -169,3 +169,69 @@ body {
   -moz-user-select: element !important;
   -ms-user-select: element !important;
   user-select: element !important;}
+
+
+.sdc-modal .sdc-modal__wrapper .sdc-modal__header{
+  height: 45px !important;
+}
+
+#VIEW{
+  .notShowOnViewMode {
+    display: none !important;
+  }
+}
+
+#RETRY{
+  .notShowOnRetryMode {
+    display: none !important;
+  }
+}
+
+#CREATE{
+  .notShowOnCreateMode {
+    display: none !important;
+  }
+}
+
+tooltip-template {
+  position: absolute;
+  z-index: 9000;
+}
+
+.sdc-checkbox label {
+  display: inline !important;
+}
+
+sdc-checkbox {
+  vertical-align: middle !important;
+}
+
+
+.popover.error {
+  border-top: 4px solid #cf2a2a !important;
+  border-radius: 0;
+  padding: 0px 10px 0px 10px;
+  box-shadow: 0 0px 10px 0 rgba(0, 0, 0, 0.5);
+}
+
+.popover.success {
+  border-top: 4px solid #4ca90c !important;
+  border-radius: 0;
+  padding: 0px 10px 0px 10px;
+  box-shadow: 0 0px 10px 0 rgba(0, 0, 0, 0.5);
+}
+
+.popover.custom {
+  border-top: 4px solid #009fdb !important;
+  border-radius: 0;
+  padding: 0px 10px 0px 10px;
+  box-shadow: 0 0px 10px 0 rgba(0, 0, 0, 0.5);
+}
+
+.popover.warning {
+  border-top: 4px solid #ffb81c !important;
+  border-radius: 0;
+  padding: 0px 10px 0px 10px;
+  box-shadow: 0 0px 10px 0 rgba(0, 0, 0, 0.5);
+}
+
index ac22a29..1861aa2 100644 (file)
@@ -6,11 +6,21 @@
     "module": "commonjs",
     "types": [
       "jasmine",
-      "node"
+      "node",
+      "jest"
+    ]
+  },
+  "paths": {
+    "@angular/*" : [
+      "../node_modules/@angular/*"
+    ],
+    "rxjs/*" : [
+      "../node_modules/rxjs/*"
     ]
   },
   "files": [
-    "test.ts"
+    "test.ts",
+    "polyfills.ts"
   ],
   "include": [
     "**/*.spec.ts",
diff --git a/vid-webpack-master/src/wallabyTest.ts b/vid-webpack-master/src/wallabyTest.ts
new file mode 100644 (file)
index 0000000..35505e5
--- /dev/null
@@ -0,0 +1,21 @@
+import './polyfills';
+
+import 'zone.js/dist/long-stack-trace-zone';
+import 'zone.js/dist/proxy.js';
+import 'zone.js/dist/sync-test';
+import 'zone.js/dist/jasmine-patch';
+import 'zone.js/dist/async-test';
+import 'zone.js/dist/fake-async-test';
+
+[1].forEach(() => 1 === 1)
+
+import { getTestBed } from '@angular/core/testing';
+import {
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+getTestBed().initTestEnvironment(
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting()
+);
index a6c016b..8f0e522 100644 (file)
@@ -1,6 +1,7 @@
 {
   "compileOnSave": false,
   "compilerOptions": {
+    "types": ["jest"],
     "outDir": "./dist/out-tsc",
     "sourceMap": true,
     "declaration": false,
@@ -15,5 +16,6 @@
       "es2017",
       "dom"
     ]
-  }
+  },
+  "exclude": ["wallabyTest.ts"]
 }
index 858759a..ed9ea64 100644 (file)
@@ -3,31 +3,40 @@
     "node_modules/codelyzer"
   ],
   "rules": {
-//    "class-name": true,
-//    "comment-format": [
-//      true,
-//      "check-space"
-//    ],
+    "arrow-return-shorthand": true,
+    "callable-types": true,
+    "class-name": true,
 //    "curly": true,
 //    "eofline": true,
 //    "forin": true,
+//    "import-blacklist": [
+//      true
+//    ],
+//    "import-spacing": true,
 //    "indent": [
 //      true,
 //      "spaces"
 //    ],
+//    "interface-over-type-literal": true,
 //    "label-position": true,
 //    "max-line-length": [
 //      true,
-//      140
+//      340
 //    ],
 //    "member-access": false,
 //    "member-ordering": [
 //      true,
-//      "static-before-instance",
-//      "variables-before-functions"
+//      {
+//        "order": [
+//          "static-field",
+//          "instance-field",
+//          "static-method",
+//          "instance-method"
+//        ]
+//      }
 //    ],
 //    "no-arg": true,
-//    "no-bitwise": true,
+//    "no-bitwise": false,
 //    "no-console": [
 //      true,
 //      "debug",
 //    ],
 //    "no-construct": true,
 //    "no-debugger": true,
-//    "no-duplicate-variable": true,
+//    "no-duplicate-super": true,
 //    "no-empty": false,
+//    "no-empty-interface": true,
 //    "no-eval": true,
-//    "no-inferrable-types": true,
+//    "no-inferrable-types": [
+//      true,
+//      "ignore-params"
+//    ],
+//    "no-misused-new": true,
+//    "no-non-null-assertion": true,
 //    "no-shadowed-variable": true,
 //    "no-string-literal": false,
+//    "no-string-throw": true,
 //    "no-switch-case-fall-through": true,
 //    "no-trailing-whitespace": true,
+//    "no-unnecessary-initializer": true,
 //    "no-unused-expression": true,
 //    "no-use-before-declare": true,
 //    "no-var-keyword": true,
 //      "check-else",
 //      "check-whitespace"
 //    ],
-//    "quotemark": [
-//      true,
-//      "single"
-//    ],
+//    "prefer-const": true,
 //    "radix": true,
 //    "semicolon": [
+//      true,
 //      "always"
 //    ],
 //    "triple-equals": [
 //        "variable-declaration": "nospace"
 //      }
 //    ],
+//    "typeof-compare": false,
+//    "unified-signatures": true,
 //    "variable-name": false,
-//
+//    "whitespace": [
+//      true,
+//      "check-branch",
+//      "check-decl",
+//      "check-operator",
+//      "check-separator",
+//      "check-type"
+//    ],
 //    "directive-selector": [
 //      true,
 //      "attribute",
-//      "",
+//      "app",
 //      "camelCase"
 //    ],
 //    "component-selector": [
 //      true,
 //      "element",
-//      "",
+//      "app",
 //      "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
+    "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,
+    "no-access-missing-member": false,
+    "templates-use-public": false,
+    "invoke-injectable": false
   }
 }
diff --git a/vid-webpack-master/wallaby.js b/vid-webpack-master/wallaby.js
new file mode 100644 (file)
index 0000000..c02f096
--- /dev/null
@@ -0,0 +1,29 @@
+const ngxWallabyJest = require('ngx-wallaby-jest');
+
+module.exports = function (wallaby) {
+  return {
+    files: [
+      'src/**/*.+(ts|html|json|snap|css|less|sass|scss|jpg|jpeg|gif|png|svg)',
+      'tsconfig.json',
+      'tsconfig.spec.json',
+      'jest.config.js',
+      '!src/**/*.spec.ts',
+    ],
+
+    tests: ['src/**/*.spec.ts'],
+
+    env: {
+      type: 'node',
+      runner: 'node'
+    },
+    compilers: {
+      '**/*.ts?(x)': wallaby.compilers.typeScript({ module: 'commonjs' }),
+    },
+    preprocessors: {
+      // This translate templateUrl and styleUrls to the right implementation
+      // For wallaby
+      'projects/**/*.component.ts': ngxWallabyJest,
+    },
+    testFramework: 'jest'
+  };
+};