mrutkows closed pull request #863: Refactoring ManifestReader
URL: https://github.com/apache/incubator-openwhisk-wskdeploy/pull/863
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/cmd/root.go b/cmd/root.go
index 77b2e031..4d665dd7 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -150,7 +150,7 @@ func loadDefaultDeploymentFileFromProjectPath(command 
string, projectPath string
        } else if _, err := os.Stat(path.Join(projectPath, 
utils.DeploymentFileNameYml)); err == nil {
                utils.Flags.DeploymentPath = path.Join(projectPath, 
utils.DeploymentFileNameYml)
        }
-       displayCommandUsingFilenameMessage(command, wski18n.DEPLOYMENT_FILE, 
utils.Flags.ManifestPath)
+       displayCommandUsingFilenameMessage(command, wski18n.DEPLOYMENT_FILE, 
utils.Flags.DeploymentPath)
        return nil
 }
 
@@ -167,14 +167,19 @@ func Deploy() error {
        projectPath, _ := filepath.Abs(project_Path)
 
        // If manifest filename is not provided, attempt to load default 
manifests from project path
+       // default manifests are manifest.yaml and manifest.yml
+       // return failure if none of the default manifest files were found
        if utils.Flags.ManifestPath == "" {
                if err := 
loadDefaultManifestFileFromProjectPath(wski18n.CMD_DEPLOY, projectPath); err != 
nil {
                        return err
                }
        }
 
+       // If deployment filename is not provided, attempt to load default 
deployment files from project path
+       // default deployments are deployment.yaml and deployment.yml
+       // continue processing manifest file, even if none of the default
+       // deployment files were found as deployment files are optional
        if utils.Flags.DeploymentPath == "" {
-
                if err := 
loadDefaultDeploymentFileFromProjectPath(wski18n.CMD_DEPLOY, projectPath); err 
!= nil {
                        return err
                }
@@ -182,7 +187,9 @@ func Deploy() error {
 
        if utils.MayExists(utils.Flags.ManifestPath) {
 
+               // Create an instance of ServiceDeployer
                var deployer = deployers.NewServiceDeployer()
+               // Set Project Path, Manifest Path, and Deployment Path of 
ServiceDeployer
                deployer.ProjectPath = projectPath
                deployer.ManifestPath = utils.Flags.ManifestPath
                deployer.DeploymentPath = utils.Flags.DeploymentPath
@@ -191,6 +198,7 @@ func Deploy() error {
                // master record of any dependency that has been downloaded
                deployer.DependencyMaster = 
make(map[string]utils.DependencyRecord)
 
+               // Read credentials from Configuration file, manifest file or 
deployment file
                clientConfig, error := deployers.NewWhiskConfig(
                        utils.Flags.CfgFile,
                        utils.Flags.DeploymentPath,
@@ -210,14 +218,14 @@ func Deploy() error {
                // The auth, apihost and namespace have been chosen, so that we 
can check the supported runtimes here.
                setSupportedRuntimes(clientConfig.Host)
 
+               // Construct Deployment Plan
                err := deployer.ConstructDeploymentPlan()
-
                if err != nil {
                        return err
                }
 
+               // Deploy all OW entities
                err = deployer.Deploy()
-
                if err != nil {
                        return err
                } else {
diff --git a/deployers/manifestreader.go b/deployers/manifestreader.go
index 1f9171da..c19fd689 100644
--- a/deployers/manifestreader.go
+++ b/deployers/manifestreader.go
@@ -18,13 +18,14 @@
 package deployers
 
 import (
-       "errors"
        "strings"
 
+       "fmt"
        "github.com/apache/incubator-openwhisk-client-go/whisk"
        "github.com/apache/incubator-openwhisk-wskdeploy/parsers"
        "github.com/apache/incubator-openwhisk-wskdeploy/utils"
        "github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
+       "github.com/apache/incubator-openwhisk-wskdeploy/wski18n"
 )
 
 var clientConfig *whisk.Config
@@ -58,32 +59,31 @@ func (reader *ManifestReader) InitPackages(manifestParser 
*parsers.YAMLParser, m
                return err
        }
        reader.SetPackages(packages)
-
        return nil
 }
 
 // Wrapper parser to handle yaml dir
-func (deployer *ManifestReader) HandleYaml(sdeployer *ServiceDeployer, 
manifestParser *parsers.YAMLParser, manifest *parsers.YAML, managedAnnotations 
whisk.KeyValue) error {
+func (reader *ManifestReader) HandleYaml(sdeployer *ServiceDeployer, 
manifestParser *parsers.YAMLParser, manifest *parsers.YAML, managedAnnotations 
whisk.KeyValue) error {
 
        var err error
        var manifestName = manifest.Filepath
 
-       deps, err := 
manifestParser.ComposeDependenciesFromAllPackages(manifest, 
deployer.serviceDeployer.ProjectPath, deployer.serviceDeployer.ManifestPath, 
managedAnnotations)
+       deps, err := 
manifestParser.ComposeDependenciesFromAllPackages(manifest, 
reader.serviceDeployer.ProjectPath, reader.serviceDeployer.ManifestPath, 
managedAnnotations)
        if err != nil {
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
 
-       actions, err := manifestParser.ComposeActionsFromAllPackages(manifest, 
deployer.serviceDeployer.ManifestPath, managedAnnotations)
+       actions, err := manifestParser.ComposeActionsFromAllPackages(manifest, 
reader.serviceDeployer.ManifestPath, managedAnnotations)
        if err != nil {
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
 
-       sequences, err := 
manifestParser.ComposeSequencesFromAllPackages(deployer.serviceDeployer.ClientConfig.Namespace,
 manifest, deployer.serviceDeployer.ManifestPath, managedAnnotations)
+       sequences, err := 
manifestParser.ComposeSequencesFromAllPackages(reader.serviceDeployer.ClientConfig.Namespace,
 manifest, reader.serviceDeployer.ManifestPath, managedAnnotations)
        if err != nil {
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
 
-       triggers, err := 
manifestParser.ComposeTriggersFromAllPackages(manifest, 
deployer.serviceDeployer.ManifestPath, managedAnnotations)
+       triggers, err := 
manifestParser.ComposeTriggersFromAllPackages(manifest, 
reader.serviceDeployer.ManifestPath, managedAnnotations)
        if err != nil {
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
@@ -93,37 +93,37 @@ func (deployer *ManifestReader) HandleYaml(sdeployer 
*ServiceDeployer, manifestP
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
 
-       apis, err := 
manifestParser.ComposeApiRecordsFromAllPackages(deployer.serviceDeployer.ClientConfig,
 manifest)
+       apis, err := 
manifestParser.ComposeApiRecordsFromAllPackages(reader.serviceDeployer.ClientConfig,
 manifest)
        if err != nil {
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
 
-       err = deployer.SetDependencies(deps)
+       err = reader.SetDependencies(deps)
        if err != nil {
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
 
-       err = deployer.SetActions(actions)
+       err = reader.SetActions(actions)
        if err != nil {
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
 
-       err = deployer.SetSequences(sequences)
+       err = reader.SetSequences(sequences)
        if err != nil {
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
 
-       err = deployer.SetTriggers(triggers)
+       err = reader.SetTriggers(triggers)
        if err != nil {
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
 
-       err = deployer.SetRules(rules)
+       err = reader.SetRules(rules)
        if err != nil {
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
 
-       err = deployer.SetApis(apis)
+       err = reader.SetApis(apis)
        if err != nil {
                return wskderrors.NewYAMLFileFormatError(manifestName, err)
        }
@@ -131,36 +131,6 @@ func (deployer *ManifestReader) HandleYaml(sdeployer 
*ServiceDeployer, manifestP
        return nil
 }
 
-func (reader *ManifestReader) SetDependencies(deps 
map[string]utils.DependencyRecord) error {
-       for name, dep := range deps {
-               n := strings.Split(name, ":")
-               depName := n[1]
-               if depName == "" {
-                       return nil
-               }
-               if !dep.IsBinding && !reader.IsUndeploy {
-                       if _, exists := 
reader.serviceDeployer.DependencyMaster[depName]; !exists {
-                               // dependency
-                               gitReader := utils.NewGitReader(depName, dep)
-                               err := gitReader.CloneDependency()
-                               if err != nil {
-                                       return 
wskderrors.NewYAMLFileFormatError(depName, err)
-                               }
-                       } else {
-                               // TODO: we should do a check to make sure this 
dependency is compatible with an already installed one.
-                               // If not, we should throw dependency mismatch 
error.
-                       }
-               }
-
-               // store in two places (one local to package to preserve 
relationship, one in master record to check for conflics
-               
reader.serviceDeployer.Deployment.Packages[dep.Packagename].Dependencies[depName]
 = dep
-               reader.serviceDeployer.DependencyMaster[depName] = dep
-
-       }
-
-       return nil
-}
-
 func (reader *ManifestReader) SetPackages(packages map[string]*whisk.Package) 
error {
 
        dep := reader.serviceDeployer
@@ -169,13 +139,6 @@ func (reader *ManifestReader) SetPackages(packages 
map[string]*whisk.Package) er
        defer dep.mt.Unlock()
 
        for _, pkg := range packages {
-               _, exist := dep.Deployment.Packages[pkg.Name]
-               if exist {
-                       // TODO(): i18n of error message (or create a new named 
error)
-                       // TODO(): Is there a better way to handle an existing 
dependency of same name?
-                       err := errors.New("Package [" + pkg.Name + "] exists 
already.")
-                       return 
wskderrors.NewYAMLParserErr(reader.serviceDeployer.ManifestPath, err)
-               }
                newPack := NewDeploymentPackage()
                newPack.Package = pkg
                dep.Deployment.Packages[pkg.Name] = newPack
@@ -183,126 +146,78 @@ func (reader *ManifestReader) SetPackages(packages 
map[string]*whisk.Package) er
        return nil
 }
 
-func (reader *ManifestReader) SetActions(actions []utils.ActionRecord) error {
+func (reader *ManifestReader) SetDependencies(deps 
map[string]utils.DependencyRecord) error {
 
        dep := reader.serviceDeployer
 
        dep.mt.Lock()
        defer dep.mt.Unlock()
 
-       for _, manifestAction := range actions {
-               existAction, exists := 
reader.serviceDeployer.Deployment.Packages[manifestAction.Packagename].Actions[manifestAction.Action.Name]
-
-               if exists == true {
-                       if existAction.Filepath == manifestAction.Filepath || 
manifestAction.Filepath == "" {
-                               // we're adding a filesystem detected action so 
just updated code and filepath if needed
-                               if manifestAction.Action.Exec.Kind != "" {
-                                       existAction.Action.Exec.Kind = 
manifestAction.Action.Exec.Kind
-                               }
-
-                               if manifestAction.Action.Exec.Code != nil {
-                                       code := *manifestAction.Action.Exec.Code
-                                       if code != "" {
-                                               existAction.Action.Exec.Code = 
manifestAction.Action.Exec.Code
-                                       }
-                               }
-
-                               existAction.Action.Annotations = 
manifestAction.Action.Annotations
-                               existAction.Action.Limits = 
manifestAction.Action.Limits
-                               existAction.Action.Parameters = 
manifestAction.Action.Parameters
-                               existAction.Action.Version = 
manifestAction.Action.Version
-
-                               if manifestAction.Filepath != "" {
-                                       existAction.Filepath = 
manifestAction.Filepath
-                               }
-
-                               err := reader.checkAction(existAction)
-                               if err != nil {
-                                       return 
wskderrors.NewFileReadError(manifestAction.Filepath, err)
+       for name, dependency := range deps {
+               // name is <packagename>:<dependencylabel>
+               depName := strings.Split(name, ":")[1]
+               if len(depName) == 0 {
+                       return nil
+               }
+               if !dependency.IsBinding && !reader.IsUndeploy {
+                       if _, exists := dep.DependencyMaster[depName]; exists {
+                               if 
!utils.CompareDependencyRecords(dep.DependencyMaster[depName], dependency) {
+                                       location := 
strings.Join([]string{dep.DependencyMaster[depName].Location, 
dependency.Location}, ",")
+                                       errmsg := 
wski18n.T(wski18n.ID_ERR_DEPENDENCIES_WITH_SAME_LABEL_X_dependency_X_location_X,
+                                               
map[string]interface{}{wski18n.KEY_DEPENDENCY: depName,
+                                                       wski18n.KEY_LOCATION: 
location})
+                                       return 
wskderrors.NewYAMLParserErr(dep.ManifestPath, errmsg)
                                }
-
-                       } else {
-                               // Action exists, but references two different 
sources
-                               // TODO(): i18n of error message (or create a 
new named error)
-                               err := errors.New("Conflict detected for action 
named [" +
-                                       existAction.Action.Name + "].\nFound 
two locations for source file: [" +
-                                       existAction.Filepath + "] and [" + 
manifestAction.Filepath + "]")
-                               return 
wskderrors.NewYAMLParserErr(reader.serviceDeployer.ManifestPath, err)
                        }
-               } else {
-                       // not a new action so update the action in the package
-                       err := reader.checkAction(manifestAction)
+                       gitReader := utils.NewGitReader(depName, dependency)
+                       err := gitReader.CloneDependency()
                        if err != nil {
-                               return 
wskderrors.NewFileReadError(manifestAction.Filepath, err)
+                               return err
                        }
-                       
reader.serviceDeployer.Deployment.Packages[manifestAction.Packagename].Actions[manifestAction.Action.Name]
 = manifestAction
                }
+               // store in two places (one local to package to preserve 
relationship, one in master record to check for conflics
+               
dep.Deployment.Packages[dependency.Packagename].Dependencies[depName] = 
dependency
+               dep.DependencyMaster[depName] = dependency
        }
 
        return nil
 }
 
-// TODO create named errors
-// Check action record before deploying it
-// action record is created by reading and composing action elements from 
manifest file
-// Action.kind is mandatory which is set to
-// (1) action runtime for an action and (2) set to "sequence" for a sequence
-// Also, action executable code should be specified for any action
-func (reader *ManifestReader) checkAction(action utils.ActionRecord) error {
-       if action.Action.Exec.Kind == "" {
-               // TODO(): i18n of error message (or create a new named error)
-               err := errors.New("Action [" + action.Action.Name + "] has no 
kind set.")
-               return 
wskderrors.NewYAMLParserErr(reader.serviceDeployer.ManifestPath, err)
-       }
+func (reader *ManifestReader) SetActions(actions []utils.ActionRecord) error {
 
-       if action.Action.Exec.Code != nil {
-               code := *action.Action.Exec.Code
-               if code == "" && action.Action.Exec.Kind != 
parsers.YAML_KEY_SEQUENCE {
-                       // TODO(): i18n of error message (or create a new named 
error)
-                       err := errors.New("Action [" + action.Action.Name + "] 
has no source code.")
-                       return 
wskderrors.NewYAMLParserErr(reader.serviceDeployer.ManifestPath, err)
+       dep := reader.serviceDeployer
+
+       dep.mt.Lock()
+       defer dep.mt.Unlock()
+
+       for _, manifestAction := range actions {
+               err := reader.checkAction(manifestAction)
+               if err != nil {
+                       return err
                }
+               
dep.Deployment.Packages[manifestAction.Packagename].Actions[manifestAction.Action.Name]
 = manifestAction
        }
-
        return nil
 }
 
-func (reader *ManifestReader) SetSequences(actions []utils.ActionRecord) error 
{
+func (reader *ManifestReader) SetSequences(sequences []utils.ActionRecord) 
error {
        dep := reader.serviceDeployer
 
        dep.mt.Lock()
        defer dep.mt.Unlock()
 
-       for _, seqAction := range actions {
-               // check if the sequence action is exist in actions
-               // If the sequence action exists in actions, return error
-               _, exists := 
reader.serviceDeployer.Deployment.Packages[seqAction.Packagename].Actions[seqAction.Action.Name]
-               if exists == true {
-                       // TODO(798): i18n of error message (or create a new 
named error)
-                       err := errors.New("Sequence action's name [" +
-                               seqAction.Action.Name + "] is already used by 
an action.")
+       for _, sequence := range sequences {
+               // If the sequence name matches with any of the actions 
defined, return error
+               if _, exists := 
dep.Deployment.Packages[sequence.Packagename].Actions[sequence.Action.Name]; 
exists {
+                       err := 
wski18n.T(wski18n.ID_ERR_SEQUENCE_HAVING_SAME_NAME_AS_ACTION_X_action_X,
+                               map[string]interface{}{wski18n.KEY_SEQUENCE: 
sequence.Action.Name})
                        return 
wskderrors.NewYAMLParserErr(reader.serviceDeployer.ManifestPath, err)
                }
-               existAction, exists := 
reader.serviceDeployer.Deployment.Packages[seqAction.Packagename].Sequences[seqAction.Action.Name]
-
-               if exists == true {
-                       existAction.Action.Annotations = 
seqAction.Action.Annotations
-                       existAction.Action.Exec.Kind = "sequence"
-                       existAction.Action.Exec.Components = 
seqAction.Action.Exec.Components
-                       existAction.Action.Publish = seqAction.Action.Publish
-                       existAction.Action.Namespace = 
seqAction.Action.Namespace
-                       existAction.Action.Limits = seqAction.Action.Limits
-                       existAction.Action.Parameters = 
seqAction.Action.Parameters
-                       existAction.Action.Version = seqAction.Action.Version
-               } else {
-                       // not a new action so update the action in the package
-                       err := reader.checkAction(seqAction)
-                       if err != nil {
-                               // TODO() Need a better error type here
-                               return 
wskderrors.NewFileReadError(seqAction.Filepath, err)
-                       }
-                       
reader.serviceDeployer.Deployment.Packages[seqAction.Packagename].Sequences[seqAction.Action.Name]
 = seqAction
+               err := reader.checkAction(sequence)
+               if err != nil {
+                       return err
                }
+               
dep.Deployment.Packages[sequence.Packagename].Sequences[sequence.Action.Name] = 
sequence
        }
 
        return nil
@@ -317,19 +232,29 @@ func (reader *ManifestReader) SetTriggers(triggers 
[]*whisk.Trigger) error {
        defer dep.mt.Unlock()
 
        for _, trigger := range triggers {
-               existTrigger, exist := dep.Deployment.Triggers[trigger.Name]
-               if exist {
-                       existTrigger.Name = trigger.Name
-                       existTrigger.ActivationId = trigger.ActivationId
-                       existTrigger.Namespace = trigger.Namespace
-                       existTrigger.Annotations = trigger.Annotations
-                       existTrigger.Version = trigger.Version
-                       existTrigger.Parameters = trigger.Parameters
-                       existTrigger.Publish = trigger.Publish
-               } else {
-                       dep.Deployment.Triggers[trigger.Name] = trigger
+               if _, exists := dep.Deployment.Triggers[trigger.Name]; exists {
+                       var feed string
+                       var existingFeed string
+                       for _, a := range 
dep.Deployment.Triggers[trigger.Name].Annotations {
+                               if a.Key == parsers.YAML_KEY_FEED {
+                                       existingFeed = a.Value.(string)
+                               }
+                       }
+                       for _, a := range trigger.Annotations {
+                               if a.Key == parsers.YAML_KEY_FEED {
+                                       feed = a.Value.(string)
+                               }
+                       }
+                       if feed != existingFeed {
+                               feed = fmt.Sprintf("%q", feed)
+                               existingFeed = fmt.Sprintf("%q", existingFeed)
+                               err := 
wski18n.T(wski18n.ID_ERR_CONFLICTING_TRIGGERS_ACROSS_PACKAGES_X_trigger_X_feed_X,
+                                       
map[string]interface{}{wski18n.KEY_TRIGGER: trigger.Name,
+                                               wski18n.KEY_TRIGGER_FEED: 
strings.Join([]string{feed, existingFeed}, ", ")})
+                               return 
wskderrors.NewYAMLParserErr(reader.serviceDeployer.ManifestPath, err)
+                       }
                }
-
+               dep.Deployment.Triggers[trigger.Name] = trigger
        }
        return nil
 }
@@ -341,19 +266,24 @@ func (reader *ManifestReader) SetRules(rules 
[]*whisk.Rule) error {
        defer dep.mt.Unlock()
 
        for _, rule := range rules {
-               existRule, exist := dep.Deployment.Rules[rule.Name]
-               if exist {
-                       existRule.Name = rule.Name
-                       existRule.Publish = rule.Publish
-                       existRule.Version = rule.Version
-                       existRule.Namespace = rule.Namespace
-                       existRule.Action = rule.Action
-                       existRule.Trigger = rule.Trigger
-                       existRule.Status = rule.Status
-               } else {
-                       dep.Deployment.Rules[rule.Name] = rule
+               if _, exists := dep.Deployment.Rules[rule.Name]; exists {
+                       action := rule.Action.(string)
+                       existingAction := 
dep.Deployment.Rules[rule.Name].Action.(string)
+                       trigger := rule.Trigger.(string)
+                       existingTrigger := 
dep.Deployment.Rules[rule.Name].Trigger.(string)
+                       if action != existingAction || trigger != 
existingTrigger {
+                               action = fmt.Sprintf("%q", action)
+                               existingAction = fmt.Sprintf("%q", 
existingAction)
+                               trigger = fmt.Sprintf("%q", trigger)
+                               existingTrigger = fmt.Sprintf("%q", 
existingTrigger)
+                               err := 
wski18n.T(wski18n.ID_ERR_CONFLICTING_RULES_ACROSS_PACKAGES_X_rule_X_action_X_trigger_X,
+                                       
map[string]interface{}{wski18n.KEY_RULE: rule.Name,
+                                               wski18n.KEY_TRIGGER: 
strings.Join([]string{trigger, existingTrigger}, ", "),
+                                               wski18n.KEY_ACTION:  
strings.Join([]string{action, existingAction}, ", ")})
+                               return 
wskderrors.NewYAMLParserErr(reader.serviceDeployer.ManifestPath, err)
+                       }
                }
-
+               dep.Deployment.Rules[rule.Name] = rule
        }
        return nil
 }
@@ -365,13 +295,31 @@ func (reader *ManifestReader) SetApis(ar 
[]*whisk.ApiCreateRequest) error {
        defer dep.mt.Unlock()
 
        for _, api := range ar {
-               existApi, exist := dep.Deployment.Apis[api.ApiDoc.Action.Name]
-               if exist {
-                       existApi.ApiDoc.ApiName = api.ApiDoc.ApiName
-               } else {
-                       dep.Deployment.Apis[api.ApiDoc.Action.Name] = api
-               }
+               dep.Deployment.Apis[api.ApiDoc.Action.Name] = api
+       }
+       return nil
+}
 
+// Check action record before deploying it
+// action record is created by reading and composing action elements from 
manifest file
+// Action.kind is mandatory which is set to
+// (1) action runtime for an action and (2) set to "sequence" for a sequence
+// Also, action executable code should be specified for any action
+func (reader *ManifestReader) checkAction(action utils.ActionRecord) error {
+       if action.Action.Exec.Kind == "" {
+               err := wski18n.T(wski18n.ID_ERR_ACTION_WITHOUT_KIND_X_action_X,
+                       map[string]interface{}{wski18n.KEY_ACTION: 
action.Action.Name})
+               return 
wskderrors.NewYAMLParserErr(reader.serviceDeployer.ManifestPath, err)
+       }
+
+       if action.Action.Exec.Code != nil {
+               code := *action.Action.Exec.Code
+               if code == "" && action.Action.Exec.Kind != 
parsers.YAML_KEY_SEQUENCE {
+                       err := 
wski18n.T(wski18n.ID_ERR_ACTION_WITHOUT_SOURCE_X_action_X,
+                               map[string]interface{}{wski18n.KEY_ACTION: 
action.Action.Name})
+                       return 
wskderrors.NewYAMLParserErr(reader.serviceDeployer.ManifestPath, err)
+               }
        }
+
        return nil
 }
diff --git a/deployers/manifestreader_test.go b/deployers/manifestreader_test.go
index 7d5acbc5..bf2e439c 100644
--- a/deployers/manifestreader_test.go
+++ b/deployers/manifestreader_test.go
@@ -20,38 +20,327 @@
 package deployers
 
 import (
+       "fmt"
+       "testing"
+
        "github.com/apache/incubator-openwhisk-client-go/whisk"
        "github.com/apache/incubator-openwhisk-wskdeploy/parsers"
        "github.com/apache/incubator-openwhisk-wskdeploy/utils"
        "github.com/apache/incubator-openwhisk-wskdeploy/wskprint"
        "github.com/stretchr/testify/assert"
-       "testing"
 )
 
 var mr *ManifestReader
 var ps *parsers.YAMLParser
 var ms *parsers.YAML
 
-func init() {
+const (
+       // local error messages
+       TEST_ERROR_BUILD_SERVICE_DEPLOYER        = "Manifest [%s]: Failed to 
build service deployer."
+       TEST_ERROR_MANIFEST_PARSE_FAILURE        = "Manifest [%s]: Failed to 
parse."
+       TEST_ERROR_MANIFEST_SET_PACKAGES         = "Manifest [%s]: Failed to 
set packages."
+       TEST_ERROR_FAILED_TO_REPORT_ERROR        = "Manifest [%s]: Failed to 
report parser error."
+       TEST_ERROR_MANIFEST_SET_ANNOTATION       = "[%s]: Failed to set 
Annotation value."
+       TEST_ERROR_MANIFEST_SET_INPUT_PARAMETER  = "[%s]: Failed to set input 
Parameter value."
+       TEST_ERROR_MANIFEST_SET_PUBLISH          = "Package [%s]: Failed to set 
publish."
+       TEST_ERROR_MANIFEST_SET_DEPENDENCIES     = "Package [%s]: Failed to set 
dependencies."
+       TEST_ERROR_MANIFEST_SET_ACTION_CODE      = "Action [%s]: Failed to set 
action code."
+       TEST_ERROR_MANIFEST_SET_ACTION_KIND      = "Action [%s]: Failed to set 
action kind."
+       TEST_ERROR_MANIFEST_SET_ACTION_WEB       = "Action [%s]: Failed to set 
web action."
+       TEST_ERROR_MANIFEST_SET_ACTION_CONDUCTOR = "Action [%s]: Failed to set 
conductor action."
+       TEST_ERROR_MANIFEST_SET_ACTION_IMAGE     = "Action [%s]: Failed to set 
action image."
+)
 
+func init() {
        // Setup "trace" flag for unit tests based upon "go test" -v flag
        utils.Flags.Trace = wskprint.DetectGoTestVerbose()
-
-       sd = NewServiceDeployer()
-       sd.ManifestPath = manifest_file
-       mr = NewManifestReader(sd)
-       ps = parsers.NewYAMLParser()
-       ms, _ = ps.ParseManifest(manifest_file)
 }
 
-// Test could parse Manifest file successfully
-func TestManifestReader_ParseManifest(t *testing.T) {
-       _, _, err := mr.ParseManifest()
-       assert.Equal(t, err, nil, "New ManifestReader failed")
+func buildServiceDeployer(manifestFile string) (*ServiceDeployer, error) {
+       deploymentFile := ""
+       var deployer = NewServiceDeployer()
+       deployer.ManifestPath = manifestFile
+       deployer.DeploymentPath = deploymentFile
+       deployer.Preview = utils.Flags.Preview
+
+       deployer.DependencyMaster = make(map[string]utils.DependencyRecord)
+
+       config := whisk.Config{
+               Namespace:        "test",
+               AuthToken:        "user:pass",
+               Host:             "host",
+               ApigwAccessToken: "token",
+       }
+       deployer.ClientConfig = &config
+
+       op, error := utils.ParseOpenWhisk(deployer.ClientConfig.Host)
+       if error == nil {
+               utils.SupportedRunTimes = utils.ConvertToMap(op)
+               utils.DefaultRunTimes = utils.DefaultRuntimes(op)
+               utils.FileExtensionRuntimeKindMap = 
utils.FileExtensionRuntimes(op)
+               utils.FileRuntimeExtensionsMap = utils.FileRuntimeExtensions(op)
+       }
+
+       return deployer, nil
 }
 
-// Test could Init root package successfully.
 func TestManifestReader_InitPackages(t *testing.T) {
-       err := mr.InitPackages(ps, ms, whisk.KeyValue{})
-       assert.Equal(t, err, nil, "Init Root Package failed")
+       manifestFile := 
"../tests/dat/manifest_validate_package_inputs_and_annotations.yaml"
+       deployer, err := buildServiceDeployer(manifestFile)
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_BUILD_SERVICE_DEPLOYER, 
manifestFile))
+
+       var manifestReader = NewManifestReader(deployer)
+       manifestReader.IsUndeploy = false
+       manifest, manifestParser, err := manifestReader.ParseManifest()
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_PARSE_FAILURE, 
manifestFile))
+
+       err = manifestReader.InitPackages(manifestParser, manifest, 
whisk.KeyValue{})
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_SET_PACKAGES, 
manifestFile))
+       assert.Equal(t, 3, len(deployer.Deployment.Packages), 
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_PACKAGES, manifestFile, ""))
+
+       expectedParametersAndAnnotations := 0
+
+       for packageName, pack := range deployer.Deployment.Packages {
+               switch packageName {
+               case "helloworld1":
+                       expectedParametersAndAnnotations = 0
+                       assert.False(t, *pack.Package.Publish, 
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_PUBLISH, packageName))
+               case "helloworld2":
+                       expectedParametersAndAnnotations = 1
+                       for _, param := range pack.Package.Parameters {
+                               switch param.Key {
+                               case "helloworld_input1":
+                                       assert.Equal(t, "value1", param.Value,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_INPUT_PARAMETER, packageName))
+                               }
+                       }
+                       for _, annotation := range pack.Package.Annotations {
+                               switch annotation.Key {
+                               case "helloworld_annotation1":
+                                       assert.Equal(t, "value1", 
annotation.Value,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_ANNOTATION, packageName))
+                               }
+                       }
+                       assert.False(t, *pack.Package.Publish, 
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_PUBLISH, packageName))
+               case "helloworld3":
+                       expectedParametersAndAnnotations = 2
+                       for _, param := range pack.Package.Parameters {
+                               switch param.Key {
+                               case "helloworld_input1":
+                                       assert.Equal(t, "value1", param.Value,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_INPUT_PARAMETER, packageName))
+                               case "helloworld_input2":
+                                       assert.Equal(t, "value2", param.Value,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_INPUT_PARAMETER, packageName))
+                               }
+                       }
+                       for _, annotation := range pack.Package.Annotations {
+                               switch annotation.Key {
+                               case "helloworld_annotation1":
+                                       assert.Equal(t, "value1", 
annotation.Value,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_ANNOTATION, packageName))
+                               case "helloworld_annotation2":
+                                       assert.Equal(t, "value2", 
annotation.Value,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_ANNOTATION, packageName))
+                               }
+                       }
+                       assert.True(t, *pack.Package.Publish, 
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_PUBLISH, packageName))
+               }
+               assert.Equal(t, expectedParametersAndAnnotations, 
len(pack.Package.Parameters),
+                       fmt.Sprintf(TEST_ERROR_MANIFEST_SET_INPUT_PARAMETER, 
packageName))
+               assert.Equal(t, expectedParametersAndAnnotations, 
len(pack.Package.Annotations),
+                       fmt.Sprintf(TEST_ERROR_MANIFEST_SET_ANNOTATION, 
packageName))
+       }
+}
+
+func TestManifestReader_SetDependencies(t *testing.T) {
+       manifestFile := "../tests/dat/manifest_validate_dependencies.yaml"
+       deployer, err := buildServiceDeployer(manifestFile)
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_BUILD_SERVICE_DEPLOYER, 
manifestFile))
+
+       var manifestReader = NewManifestReader(deployer)
+       manifestReader.IsUndeploy = false
+       manifest, manifestParser, err := manifestReader.ParseManifest()
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_PARSE_FAILURE, 
manifestFile))
+
+       err = manifestReader.InitPackages(manifestParser, manifest, 
whisk.KeyValue{})
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_SET_PACKAGES, 
manifestFile))
+
+       err = manifestReader.HandleYaml(deployer, manifestParser, manifest, 
whisk.KeyValue{})
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_PARSE_FAILURE, 
manifestFile))
+
+       expectedLocationHelloWorlds := 
"https://github.com/apache/incubator-openwhisk-test/packages/helloworlds";
+       expectedLocationHelloWhisk := 
"https://github.com/apache/incubator-openwhisk-test/packages/hellowhisk";
+       expectedLocationUtils := "/whisk.system/utils"
+
+       for pkgName, pkg := range deployer.Deployment.Packages {
+               switch pkgName {
+               case "helloworld1":
+                       for depName, dep := range pkg.Dependencies {
+                               switch depName {
+                               case "dependency1":
+                               case "helloworlds":
+                                       assert.Equal(t, 
expectedLocationHelloWorlds, dep.Location,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_DEPENDENCIES, pkgName))
+                               case "dependency2":
+                                       assert.Equal(t, 
expectedLocationHelloWhisk, dep.Location,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_DEPENDENCIES, pkgName))
+                               case "dependency3":
+                                       assert.Equal(t, expectedLocationUtils, 
dep.Location,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_DEPENDENCIES, pkgName))
+                               }
+                       }
+
+               case "helloworld2":
+                       for depName, dep := range pkg.Dependencies {
+                               switch depName {
+                               case "helloworlds":
+                               case "dependency1":
+                               case "dependency4":
+                                       assert.Equal(t, 
expectedLocationHelloWorlds, dep.Location,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_DEPENDENCIES, pkgName))
+                               case "dependency5":
+                                       assert.Equal(t, 
expectedLocationHelloWhisk, dep.Location,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_DEPENDENCIES, pkgName))
+                               case "dependency6":
+                                       assert.Equal(t, expectedLocationUtils, 
dep.Location,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_DEPENDENCIES, pkgName))
+                               }
+                       }
+               }
+       }
+}
+
+func TestManifestReader_SetDependencies_Bogus(t *testing.T) {
+       manifestFile := "../tests/dat/manifest_validate_dependencies_bogus.yaml"
+       deployer, err := buildServiceDeployer(manifestFile)
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_BUILD_SERVICE_DEPLOYER, 
manifestFile))
+
+       var manifestReader = NewManifestReader(deployer)
+       manifestReader.IsUndeploy = false
+       manifest, manifestParser, err := manifestReader.ParseManifest()
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_PARSE_FAILURE, 
manifestFile))
+
+       err = manifestReader.InitPackages(manifestParser, manifest, 
whisk.KeyValue{})
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_SET_PACKAGES, 
manifestFile))
+
+       err = manifestReader.HandleYaml(deployer, manifestParser, manifest, 
whisk.KeyValue{})
+       assert.NotNil(t, err, fmt.Sprintf(TEST_ERROR_FAILED_TO_REPORT_ERROR, 
manifestFile))
+}
+
+func TestManifestReader_SetActions(t *testing.T) {
+       manifestFile := "../tests/dat/manifest_validate_action_all.yaml"
+       deployer, err := buildServiceDeployer(manifestFile)
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_BUILD_SERVICE_DEPLOYER, 
manifestFile))
+
+       var manifestReader = NewManifestReader(deployer)
+       manifestReader.IsUndeploy = false
+       manifest, manifestParser, err := manifestReader.ParseManifest()
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_PARSE_FAILURE, 
manifestFile))
+
+       err = manifestReader.InitPackages(manifestParser, manifest, 
whisk.KeyValue{})
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_SET_PACKAGES, 
manifestFile))
+
+       err = manifestReader.HandleYaml(deployer, manifestParser, manifest, 
whisk.KeyValue{})
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_PARSE_FAILURE, 
manifestFile))
+
+       expectedRuntime := "nodejs:6"
+       expectedImage := "openwhisk/skeleton"
+
+       for actionName, action := range 
deployer.Deployment.Packages["helloworld"].Actions {
+               switch actionName {
+               case "helloworld1":
+               case "helloworld2":
+                       assert.NotEmpty(t, action.Action.Exec.Code,
+                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_ACTION_CODE, actionName))
+                       assert.Equal(t, expectedRuntime, 
action.Action.Exec.Kind,
+                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_ACTION_KIND, actionName))
+               case "helloworld3":
+                       for _, param := range action.Action.Parameters {
+                               switch param.Key {
+                               case "parameter1":
+                                       assert.Equal(t, "value1", param.Value,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_INPUT_PARAMETER, actionName))
+                               case "parameter2":
+                                       assert.Equal(t, "value2", param.Value,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_INPUT_PARAMETER, actionName))
+                               }
+                       }
+                       for _, annotation := range action.Action.Annotations {
+                               switch annotation.Key {
+                               case "annotation1":
+                                       assert.Equal(t, "value1", 
annotation.Value,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_ANNOTATION, actionName))
+                               case "annotation2":
+                                       assert.Equal(t, "value2", 
annotation.Value,
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_ANNOTATION, actionName))
+                               }
+                       }
+               case "helloworld4":
+                       assert.True(t, action.Action.WebAction(),
+                               fmt.Sprintf(TEST_ERROR_MANIFEST_SET_ACTION_WEB, 
actionName))
+               case "helloworld5":
+                       for _, annotation := range action.Action.Annotations {
+                               switch annotation.Key {
+                               case "conductor":
+                                       assert.True(t, annotation.Value.(bool),
+                                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_ACTION_CONDUCTOR, actionName))
+                               }
+                       }
+               case "helloworld6":
+                       assert.Equal(t, expectedImage, action.Action.Exec.Image,
+                               
fmt.Sprintf(TEST_ERROR_MANIFEST_SET_ACTION_IMAGE, actionName))
+               }
+       }
+}
+
+func TestManifestReader_SetSequences_Bogus(t *testing.T) {
+       manifestFile := "../tests/dat/manifest_validate_sequences_bogus.yaml"
+       deployer, err := buildServiceDeployer(manifestFile)
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_BUILD_SERVICE_DEPLOYER, 
manifestFile))
+
+       var manifestReader = NewManifestReader(deployer)
+       manifestReader.IsUndeploy = false
+       manifest, manifestParser, err := manifestReader.ParseManifest()
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_PARSE_FAILURE, 
manifestFile))
+
+       err = manifestReader.InitPackages(manifestParser, manifest, 
whisk.KeyValue{})
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_SET_PACKAGES, 
manifestFile))
+
+       err = manifestReader.HandleYaml(deployer, manifestParser, manifest, 
whisk.KeyValue{})
+       assert.NotNil(t, err, fmt.Sprintf(TEST_ERROR_FAILED_TO_REPORT_ERROR, 
manifestFile))
+}
+
+func TestManifestReader_SetTriggers_Bogus(t *testing.T) {
+       manifestFile := "../tests/dat/manifest_validate_triggers_bogus.yaml"
+       deployer, err := buildServiceDeployer(manifestFile)
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_BUILD_SERVICE_DEPLOYER, 
manifestFile))
+
+       var manifestReader = NewManifestReader(deployer)
+       manifestReader.IsUndeploy = false
+       manifest, manifestParser, err := manifestReader.ParseManifest()
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_PARSE_FAILURE, 
manifestFile))
+
+       err = manifestReader.InitPackages(manifestParser, manifest, 
whisk.KeyValue{})
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_SET_PACKAGES, 
manifestFile))
+
+       err = manifestReader.HandleYaml(deployer, manifestParser, manifest, 
whisk.KeyValue{})
+       assert.NotNil(t, err, fmt.Sprintf(TEST_ERROR_FAILED_TO_REPORT_ERROR, 
manifestFile))
+}
+
+func TestManifestReader_SetRules_Bogus(t *testing.T) {
+       manifestFile := "../tests/dat/manifest_validate_rules_bogus.yaml"
+       deployer, err := buildServiceDeployer(manifestFile)
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_BUILD_SERVICE_DEPLOYER, 
manifestFile))
+
+       var manifestReader = NewManifestReader(deployer)
+       manifestReader.IsUndeploy = false
+       manifest, manifestParser, err := manifestReader.ParseManifest()
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_PARSE_FAILURE, 
manifestFile))
+
+       err = manifestReader.InitPackages(manifestParser, manifest, 
whisk.KeyValue{})
+       assert.Nil(t, err, fmt.Sprintf(TEST_ERROR_MANIFEST_SET_PACKAGES, 
manifestFile))
+
+       err = manifestReader.HandleYaml(deployer, manifestParser, manifest, 
whisk.KeyValue{})
+       assert.NotNil(t, err, fmt.Sprintf(TEST_ERROR_FAILED_TO_REPORT_ERROR, 
manifestFile))
 }
diff --git a/deployers/servicedeployer.go b/deployers/servicedeployer.go
index e35fe968..d3a9894a 100644
--- a/deployers/servicedeployer.go
+++ b/deployers/servicedeployer.go
@@ -1570,8 +1570,6 @@ func (deployer *ServiceDeployer) 
getDependentDeployer(depName string, depRecord
        depServiceDeployer.Client = deployer.Client
        depServiceDeployer.ClientConfig = deployer.ClientConfig
 
-       depServiceDeployer.DependencyMaster = deployer.DependencyMaster
-
        // share the master dependency list
        depServiceDeployer.DependencyMaster = deployer.DependencyMaster
 
diff --git a/parsers/manifest_parser.go b/parsers/manifest_parser.go
index c63e4dd1..3403820d 100644
--- a/parsers/manifest_parser.go
+++ b/parsers/manifest_parser.go
@@ -20,14 +20,12 @@ package parsers
 import (
        "encoding/base64"
        "errors"
+       "gopkg.in/yaml.v2"
        "io/ioutil"
        "os"
        "path"
-       "strings"
-
-       "gopkg.in/yaml.v2"
-
        "path/filepath"
+       "strings"
 
        "github.com/apache/incubator-openwhisk-client-go/whisk"
        "github.com/apache/incubator-openwhisk-wskdeploy/utils"
diff --git a/tests/dat/manifest_validate_action_all.yaml 
b/tests/dat/manifest_validate_action_all.yaml
new file mode 100644
index 00000000..8faf05f8
--- /dev/null
+++ b/tests/dat/manifest_validate_action_all.yaml
@@ -0,0 +1,43 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more 
contributor
+# license agreements.  See the NOTICE file distributed with this work for 
additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the 
License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software 
distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+packages:
+    helloworld:
+        actions:
+            helloworld1:
+                function: actions/hello.js
+            helloworld2:
+                code: const main = ({ msg }) => { console.log(msg); return 
{msg}; }
+                runtime: nodejs:6
+            helloworld3:
+                function: actions/hello.js
+                annotations:
+                    annotation1: value1
+                    annotation2: value2
+                inputs:
+                    parameter1: value1
+                    parameter2: value2
+            helloworld4:
+                function: actions/hello.js
+                web: true
+            helloworld5:
+                function: actions/hello.js
+                conductor: true
+            helloworld6:
+                function: actions/hello.js
+                docker: openwhisk/skeleton
+
+
diff --git a/tests/dat/manifest_validate_dependencies.yaml 
b/tests/dat/manifest_validate_dependencies.yaml
new file mode 100644
index 00000000..300cdad0
--- /dev/null
+++ b/tests/dat/manifest_validate_dependencies.yaml
@@ -0,0 +1,42 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more 
contributor
+# license agreements.  See the NOTICE file distributed with this work for 
additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the 
License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software 
distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+packages:
+    helloworld1:
+        dependencies:
+            helloworlds:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/helloworlds
+            dependency1:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/helloworlds
+            dependency2:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/hellowhisk
+            dependency3:
+                location: /whisk.system/utils
+    helloworld2:
+        dependencies:
+            helloworlds:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/helloworlds
+            dependency1:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/helloworlds
+            dependency4:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/helloworlds
+            dependency5:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/hellowhisk
+            dependency6:
+                location: /whisk.system/utils
+
+
+
diff --git a/tests/dat/manifest_validate_dependencies_bogus.yaml 
b/tests/dat/manifest_validate_dependencies_bogus.yaml
new file mode 100644
index 00000000..f75c3b1b
--- /dev/null
+++ b/tests/dat/manifest_validate_dependencies_bogus.yaml
@@ -0,0 +1,42 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more 
contributor
+# license agreements.  See the NOTICE file distributed with this work for 
additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the 
License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software 
distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+packages:
+    helloworld1:
+        dependencies:
+            helloworlds:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/helloworlds
+            dependency1:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/helloworlds
+            dependency2:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/hellowhisk
+            dependency3:
+                location: /whisk.system/utils
+    helloworld2:
+        dependencies:
+            helloworlds:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/helloworlds
+            dependency1:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/hellowhisk
+            dependency4:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/helloworlds
+            dependency5:
+                location: 
github.com/apache/incubator-openwhisk-test/packages/hellowhisk
+            dependency6:
+                location: /whisk.system/utils
+
+
+
diff --git a/tests/dat/manifest_validate_package_inputs_and_annotations.yaml 
b/tests/dat/manifest_validate_package_inputs_and_annotations.yaml
new file mode 100644
index 00000000..ea5f2531
--- /dev/null
+++ b/tests/dat/manifest_validate_package_inputs_and_annotations.yaml
@@ -0,0 +1,37 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more 
contributor
+# license agreements.  See the NOTICE file distributed with this work for 
additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the 
License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software 
distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+packages:
+    helloworld1:
+        license: Apache-2.0
+    helloworld2:
+        version: 2.0.0
+        license: MIT
+        inputs:
+            helloworld_input1: value1
+        annotations:
+            helloworld_annotation1: value1
+    helloworld3:
+        version: 3.0.0
+        license: GPL-3.0
+        inputs:
+            helloworld_input1: value1
+            helloworld_input2: value2
+        annotations:
+            helloworld_annotation1: value1
+            helloworld_annotation2: value2
+        public: true
+
diff --git a/tests/dat/manifest_validate_rules_bogus.yaml 
b/tests/dat/manifest_validate_rules_bogus.yaml
new file mode 100644
index 00000000..587929fa
--- /dev/null
+++ b/tests/dat/manifest_validate_rules_bogus.yaml
@@ -0,0 +1,41 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more 
contributor
+# license agreements.  See the NOTICE file distributed with this work for 
additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the 
License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software 
distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+packages:
+    helloworld1:
+        actions:
+            hello:
+                function: actions/hello.js
+        triggers:
+            trigger1:
+        rules:
+            rule1:
+                trigger: trigger1
+                action: hello
+    helloworld2:
+        actions:
+            hello:
+                function: actions/hello.js
+        triggers:
+            trigger2:
+        rules:
+            rule1:
+                trigger: trigger2
+                action: hello
+            rule2:
+                trigger: trigger2
+                action: hello
+
diff --git a/tests/dat/manifest_validate_sequences_bogus.yaml 
b/tests/dat/manifest_validate_sequences_bogus.yaml
new file mode 100644
index 00000000..4d5425d0
--- /dev/null
+++ b/tests/dat/manifest_validate_sequences_bogus.yaml
@@ -0,0 +1,38 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more 
contributor
+# license agreements.  See the NOTICE file distributed with this work for 
additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the 
License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software 
distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+packages:
+    helloworld:
+        actions:
+            hello:
+                function: actions/hello.js
+                runtime: nodejs:6
+            helloWithParams:
+                function: actions/hello.js
+                runtime: nodejs:6
+                inputs:
+                    name: Amy
+                    place: Paris
+            helloWithParams1:
+                function: actions/hello.js
+                runtime: nodejs:6
+                inputs:
+                    name: Amy
+                    place: Paris
+        sequences:
+            hello:
+                actions: helloWithParams, helloWithParams1
+
diff --git a/tests/dat/manifest_validate_triggers_bogus.yaml 
b/tests/dat/manifest_validate_triggers_bogus.yaml
new file mode 100644
index 00000000..2b3b2c23
--- /dev/null
+++ b/tests/dat/manifest_validate_triggers_bogus.yaml
@@ -0,0 +1,33 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more 
contributor
+# license agreements.  See the NOTICE file distributed with this work for 
additional
+# information regarding copyright ownership.  The ASF licenses this file to you
+# under the Apache License, Version 2.0 (the # "License"); you may not use this
+# file except in compliance with the License.  You may obtain a copy of the 
License
+# at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software 
distributed
+# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+# CONDITIONS OF ANY KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations under the License.
+#
+
+packages:
+    helloworld1:
+        actions:
+            hello:
+                function: actions/hello.js
+        triggers:
+            trigger1:
+            trigger2:
+    helloworld2:
+        actions:
+            hello:
+                function: actions/hello.js
+        triggers:
+            trigger1:
+            trigger2:
+                feed: /whisk.system/alarms/alarm
+
diff --git a/utils/dependencies.go b/utils/dependencies.go
index 9f1dd081..eba29b8a 100644
--- a/utils/dependencies.go
+++ b/utils/dependencies.go
@@ -88,3 +88,13 @@ func LocationIsGithub(location string) bool {
        paths := strings.SplitN(removeProtocol(location), "/", 2)
        return strings.Contains(paths[0], GITHUB)
 }
+
+func CompareDependencyRecords(d1 DependencyRecord, d2 DependencyRecord) bool {
+       if (d1.Location == d2.Location) && (d1.Version == d2.Version) {
+               return true
+       }
+       if (d1.BaseRepo == d2.BaseRepo) && (d1.SubFolder == d2.SubFolder) && 
(d1.Version == d2.Version) {
+               return true
+       }
+       return false
+}
diff --git a/utils/gitreader.go b/utils/gitreader.go
index 9d9c84b2..741da885 100644
--- a/utils/gitreader.go
+++ b/utils/gitreader.go
@@ -129,6 +129,5 @@ func (reader *GitReader) CloneDependency() error {
        }
 
        os.Rename(rootDir, depPath)
-
        return nil
 }
diff --git a/wski18n/i18n_ids.go b/wski18n/i18n_ids.go
index eae4a0bd..9807f0dc 100644
--- a/wski18n/i18n_ids.go
+++ b/wski18n/i18n_ids.go
@@ -78,6 +78,9 @@ const (
        KEY_DEPENDENCY      = "dependency"
        KEY_LOCATION        = "location"
        KEY_SEQUENCE        = "sequence"
+       KEY_TRIGGER         = "trigger"
+       KEY_TRIGGER_FEED    = "feed"
+       KEY_RULE            = "rule"
 )
 
 // DO NOT TRANSLATE
@@ -163,25 +166,31 @@ const (
        ID_MSG_MANAGED_FOUND_DELETED_X_key_X_name_X_project_X = 
"msg_managed_found_deleted_entity"
 
        // Errors
-       ID_ERR_DEPENDENCY_UNKNOWN_TYPE                                     = 
"msg_err_dependency_unknown_type"
-       ID_ERR_ENTITY_CREATE_X_key_X_err_X_code_X                          = 
"msg_err_entity_create"
-       ID_ERR_ENTITY_DELETE_X_key_X_err_X_code_X                          = 
"msg_err_entity_delete"
-       ID_ERR_FEED_INVOKE_X_err_X_code_X                                  = 
"msg_err_feed_invoke"
-       ID_ERR_KEY_MISSING_X_key_X                                         = 
"msg_err_key_missing_mandatory"
-       ID_ERR_MANIFEST_FILE_NOT_FOUND_X_path_X                            = 
"msg_err_manifest_not_found"
-       ID_ERR_NAME_MISMATCH_X_key_X_dname_X_dpath_X_mname_X_moath_X       = 
"msg_err_name_mismatch"
-       ID_ERR_RUNTIME_INVALID_X_runtime_X_action_X                        = 
"msg_err_runtime_invalid"
-       ID_ERR_RUNTIME_MISMATCH_X_runtime_X_ext_X_action_X                 = 
"msg_err_runtime_mismatch"
-       ID_ERR_RUNTIMES_GET_X_err_X                                        = 
"msg_err_runtimes_get"
-       ID_ERR_RUNTIME_ACTION_SOURCE_NOT_SUPPORTED_X_ext_X_action_X        = 
"msg_err_runtime_action_source_not_supported"
-       ID_ERR_URL_INVALID_X_urltype_X_url_X_filetype_X                    = 
"msg_err_url_invalid"
-       ID_ERR_URL_MALFORMED_X_urltype_X_url_X                             = 
"msg_err_url_malformed"
-       ID_ERR_API_MISSING_ACTION_OR_SEQUENCE_X_action_or_sequence_X_api_X = 
"msg_err_api_missing_action_or_sequence"
-       ID_ERR_ACTION_INVALID_X_action_X                                   = 
"msg_err_action_invalid"
-       ID_ERR_ACTION_MISSING_RUNTIME_WITH_CODE_X_action_X                 = 
"msg_err_action_missing_runtime_with_code"
-       ID_ERR_ACTION_FUNCTION_REMOTE_DIR_NOT_SUPPORTED_X_action_X_url_X   = 
"msg_err_action_function_remote_dir_not_supported"
-       ID_ERR_CANT_SAVE_DOCKER_RUNTIME                                    = 
"msg_err_cant_save_docker"
-       ID_ERR_FILE_ALREADY_EXISTS                                         = 
"msg_err_file_already_exists"
+       ID_ERR_DEPENDENCY_UNKNOWN_TYPE                                       = 
"msg_err_dependency_unknown_type"
+       ID_ERR_ENTITY_CREATE_X_key_X_err_X_code_X                            = 
"msg_err_entity_create"
+       ID_ERR_ENTITY_DELETE_X_key_X_err_X_code_X                            = 
"msg_err_entity_delete"
+       ID_ERR_FEED_INVOKE_X_err_X_code_X                                    = 
"msg_err_feed_invoke"
+       ID_ERR_KEY_MISSING_X_key_X                                           = 
"msg_err_key_missing_mandatory"
+       ID_ERR_MANIFEST_FILE_NOT_FOUND_X_path_X                              = 
"msg_err_manifest_not_found"
+       ID_ERR_NAME_MISMATCH_X_key_X_dname_X_dpath_X_mname_X_moath_X         = 
"msg_err_name_mismatch"
+       ID_ERR_RUNTIME_INVALID_X_runtime_X_action_X                          = 
"msg_err_runtime_invalid"
+       ID_ERR_RUNTIME_MISMATCH_X_runtime_X_ext_X_action_X                   = 
"msg_err_runtime_mismatch"
+       ID_ERR_RUNTIMES_GET_X_err_X                                          = 
"msg_err_runtimes_get"
+       ID_ERR_RUNTIME_ACTION_SOURCE_NOT_SUPPORTED_X_ext_X_action_X          = 
"msg_err_runtime_action_source_not_supported"
+       ID_ERR_URL_INVALID_X_urltype_X_url_X_filetype_X                      = 
"msg_err_url_invalid"
+       ID_ERR_URL_MALFORMED_X_urltype_X_url_X                               = 
"msg_err_url_malformed"
+       ID_ERR_API_MISSING_ACTION_OR_SEQUENCE_X_action_or_sequence_X_api_X   = 
"msg_err_api_missing_action_or_sequence"
+       ID_ERR_ACTION_INVALID_X_action_X                                     = 
"msg_err_action_invalid"
+       ID_ERR_ACTION_MISSING_RUNTIME_WITH_CODE_X_action_X                   = 
"msg_err_action_missing_runtime_with_code"
+       ID_ERR_ACTION_FUNCTION_REMOTE_DIR_NOT_SUPPORTED_X_action_X_url_X     = 
"msg_err_action_function_remote_dir_not_supported"
+       ID_ERR_CANT_SAVE_DOCKER_RUNTIME                                      = 
"msg_err_cant_save_docker"
+       ID_ERR_FILE_ALREADY_EXISTS                                           = 
"msg_err_file_already_exists"
+       ID_ERR_DEPENDENCIES_WITH_SAME_LABEL_X_dependency_X_location_X        = 
"msg_err_different_dependencies_with_same_label"
+       ID_ERR_ACTION_WITHOUT_KIND_X_action_X                                = 
"msg_err_action_without_kind"
+       ID_ERR_ACTION_WITHOUT_SOURCE_X_action_X                              = 
"msg_err_action_without_source"
+       ID_ERR_SEQUENCE_HAVING_SAME_NAME_AS_ACTION_X_action_X                = 
"msg_err_sequence_having_same_name_as_action"
+       ID_ERR_CONFLICTING_TRIGGERS_ACROSS_PACKAGES_X_trigger_X_feed_X       = 
"msg_err_conflicting_triggers_across_packages"
+       ID_ERR_CONFLICTING_RULES_ACROSS_PACKAGES_X_rule_X_action_X_trigger_X = 
"msg_err_conflicting_rules_across_packages"
 
        // Server-side Errors (wskdeploy as an Action)
        ID_ERR_JSON_MISSING_KEY_CMD = "msg_err_json_missing_cmd_key"
diff --git a/wski18n/i18n_resources.go b/wski18n/i18n_resources.go
index e77a8f50..030d9624 100644
--- a/wski18n/i18n_resources.go
+++ b/wski18n/i18n_resources.go
@@ -97,7 +97,7 @@ func wski18nResourcesDe_deAllJson() (*asset, error) {
        return a, nil
 }
 
-var _wski18nResourcesEn_usAllJson = 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x6f\x8f\xdb\x36\xd2\x7f\x9f\x4f\x31\x08\x1e\x20\x2d\xe0\x28\x69\x1f\x3c\xc0\x83\x00\x79\x91\x6b\xd2\x76\xaf\x4d\x36\xd8\xcd\x5e\x50\xe4\x16\x0a\x2d\x8d\x6d\xd6\x12\xa9\x23\x29\x3b\xae\xe1\xef\x7e\x98\x21\xf5\xc7\xde\xa5\xa4\x75\xda\xbb\xbe\xa9\xbb\x1c\xce\xfc\x66\x38\x9c\x7f\x54\x3f\x3d\x02\xd8\x3f\x02\x00\x78\x2c\xf3\xc7\x2f\xe0\x71\x69\x97\x69\x65\x70\x21\xbf\xa4\x68\x8c\x36\x8f\x67\x7e\xd5\x19\xa1\x6c\x21\x9c\xd4\x8a\xc8\xde\xf0\xda\x23\x80\xc3\x6c\x80\x83\x54\x0b\x1d\x61\x70\x41\x4b\x63\xfb\x6d\x9d\x65\x68\x6d\x84\xc5\x75\x58\x1d\xe3\xb2\x15\x46\x49\xb5\x8c\x70\xf9\x18\x56\xa3\x5c\xb2\x32\x4f\x73\xb4\x59\x5a\x68\xb5\x4c\x0d\x56\xda\xb8\x08\xaf\x2b\x5e\xb4\xa0\x15\xe4\x58\x15\x7a\x87\x39\xa0\x72\xd2\x49\xb4\xf0\x8d\x4c\x30\x99\xc1\x7b\x91\xad\xc5\x12\xed\x0c\x5e\x65\xb4\xcf\xce\xe0\x83\x91\xcb\x25\x1a\x3b\x83\xab\xba\xa0\x15\x74\x59\xf2\x2d\x08\x0b\x5b\x2c\x0a\xfa\xb7\xc1\x0c\x95\xe3\x1d\x1b\x96\x66\x41\x2a\x70\x2b\x04\x5b\x61\x26\x17\x12\x73\x50\xa2\x44\x5b\x89\x0c\x93\xc9\xba\x68\x1d\xd3\xe4\x15\x38\xad\x0b\x70\x3a\x28\x32\x83\x5a\xf9\x5f\x20\x54\x0e\x76\xa7\x32\xd0\x15\xaa\xed\x4a\xda\x35\x54\x41\x27\xa8\xad\x54\x4b\x10\x50\x0a\x25\x17\x68\x1d\x13\xeb\x8a\xb8\x8a\x22\xb0\x2a\x49\x93\x85\x2c\x5a\xf2\xdf\x5e\xbd\xfd\x75\x0a\x66\xbb\xd2\xc6\x0d\x1f\xc0\x7b\xa3\x37\x32\x47\x0b\x02\x6c\x5d\x96\xc2\xec\xc0\xd3\x83\x5e\xc0\x76\x25\xdc\x13\x0b\x73\xc4\xde\xf1\x7c\x9d\x19\x03\xa4\x51\x3b\x5a\x74\x64\xcb\x15\x16\x55\x10\x0d\x3b\x5d\x9b\x49\x26\x24\x53\x4d\xc7\xb2\x41\x63\x49\x76\xcc\x3e\x52\x39\x56\x38\xd0\x81\xaa\xcb\x39\x1a\x36\x8f\x5d\x7b\x68\x93\x65\x91\x17\x8c\xfa\x0f\xbb\x0a\x2b\x7b\x59\xa1\xfa\x78\xac\xec\x1c\xdd\x96\x8e\x23\x2b\x24\x79\x05\xbb\x16\x9a\x0d\x9a\xc9\x3e\x3c\x1d\x43\xcf\xfb\x48\x4e\xe3\xcf\xfc\x07\xbd\xf8\x4f\x7a\xf3\xa2\x10\xcb\x54\x54\x32\x5d\x69\x1b\x73\x1c\x0f\xe5\xd5\xfb\x0b\xf8\xfc\xf3\xe5\xf5\x87\xcf\x13\x39\x0e\x1f\x7f\x8f\xe9\x3f\xde\x5c\x5d\x5f\x5c\xbe\x9b\xc4\xb7\x76\xab\x74\x8d\xbb\x08\x53\x5a\xd6\x46\xfe\xc1\x7f\x80\xcf\xbf\xbc\xf9\x6d\x0a\xd3\x0c\x8d\x4b\xc9\x6e\x11\xae\x95\x70\x2b\x3a\x16\xf2\xd5\x84\x88\xd9\xc8\x53\x18\x6b\xb5\x90\xb1\x60\xef\x17\x99\x15\x7c\x93\xe3\x42\xd4\x85\x03\x69\xe1\x7f\x7e\xbe\x7c\xfb\xe6\x59\xb2\xb5\xeb\xca\xe8\xca\x7e\x3b\xc5\x2a\x45\xa1\xb7\x69\xe0\x11\x4b\x51\x4c\x04\x2d\xd1\x38\xd7\xce\xa9\x86\xec\xd2\x86\xe5\xd6\xfb\x26\xb0\xae\x0c\x6e\x24\x6e\x23\x7c\xed\x8a\x81\x36\x4c\x9f\x1d\x5d\x8f\xaa\x10\x6a\x82\x84\x35\xee\x26\x1f\xe9\x1a\x77\x53\x81\x7b\x4b\x97\x42\x89\x25\xe6\x83\x86\xae\x8c\xfe\x1d\x33\xd7\xe5\x5c\xa7\x61\x8e\x50\x0a\xb3\xc6\x1c\x1a\x0e\x53\x4c\xc5\x7c\x52\xca\x05\x31\x65\x82\x28\x26\x19\xe7\xd8\x84\x90\x91\x53\x3d\x0a\xfa\x13\xd8\xb6\xc9\x2a\xc2\xb7\x5b\x9f\xac\xf4\x08\x42\x1f\x9e\x0b\xb4\xb6\xb1\xf6\x04\xd6\xd6\x19\x19\xe5\xec\x8f\xae\xb6\x68\xe8\xa2\x48\x85\x39\x98\x5a\x39\x59\xb6\x49\x6a\x82\x04\x67\xe2\x46\xe0\x35\xd0\xb5\xab\xea\x29\x60\xbd\xbb\x6d\xd0\xcc\xb5\x8d\xb1\x0c\xab\xe3\x4c\x39\xde\xa4\xa5\xb4\x94\x1b\x38\x92\xc6\x03\xe9\x87\x15\x02\x51\x90\xf7\x66\x3e\x9a\xd2\x2d\x91\x16\x94\x76\xe0\x59\xd5\x06\xf3\xe4\x9f\x43\x16\x39\x91\x58\xc9\x81\x24\x43\x12\x29\x1b\x10\xc9\xd7\xc9\x19\x73\x44\x92\xd4\xd2\x9c\x27\x2a\xa8\x32\xd4\x54\x9c\xea\xf3\x69\xbf\x4f\xe8\xf7\xe1\x70\x3b\x83\x85\xd1\x25\xec\xf7\x89\xd5\xb5\xc9\xf0\x70\x98\x24\xd3\x1f\xd8\x98\x4c\x22\x6b\xce\xca\xa2\x3b\x4f\x56\x6b\x9e\x31\x69\x47\x76\x24\x15\xdb\x3f\x9c\xaf\x67\x25\x97\xdb\x54\x70\x3f\x95\x3a\xbd\x46\x35\xaa\x32\xed\x00\xbf\x03\x78\xc7\x79\xca\xd7\xaa\x14\xc6\xae\x44\x91\x16\x3a\x13\x45\x44\xe2\x4d\x43\xd5\x2b\x22\x43\x90\xb0\x5e\x1e\xef\x86\x8d\x28\x6a\xb4\x13\x05\x2a\x74\x5b\x6d\xd6\x67\x8b\x94\xca\xa1\x51\xe8\x40\x38\x52\xb7\x36\xc5\x88\xae\x5d\x46\x4d\x33\xa1\x32\x2c\x8a\x68\x3e\xbb\xfc\x25\x81\x1f\x3c\x0d\x15\x95\xdd\xce\xa9\x02\x16\x42\xc6\xb9\xbf\xee\x52\x7b\x2e\xf3\x70\x17\xcb\xaa\x40\x87\x60\x6b\x3a\xd2\x45\x5d\x14\xbb\x04\xae\x6a\x05\x9f\xdb\xc6\xa0\xad\x99\x3f\x53\x26\x30\x58\xea\x0d\x42\x25\x8c\x93\xa2\x28\x76\x5d\x4f\x25\xac\x45\x37\x7c\x0a\x3d\xa4\xbe\x41\x4b\xad\x13\xae\x8e\xd5\x51\x4f\x9f\x3e\x7d\xfa\xf2\xe5\xcb\x97\xbd\xb3\xe8\xe9\x70\xcd\x5b\x81\x08\x88\x70\x92\x54\x1e\x2d\x60\x3e\xc5\x44\x8d\x69\x72\x08\xf3\x08\x6f\x9c\x61\x27\x3b\xff\xac\xfb\x7b\xa7\x0b\x19\x3c\xef\x9b\x7e\x31\x37\x78\xe2\x93\xe5\x8d\xd9\xef\x48\xe4\x19\x16\xcc\x74\x59\x0a\x95\xa7\xdc\x54\x71\x55\x49\x51\x2e\x15\x2e\xa5\x4a\x24\x22\x74\xbf\x4f\xb2\x32\x3f\x1c\x42\x2b\xb6\xdf\x27\xb4\xd1\xed\x2a\x3c\x1c\x38\x52\xd2\xde\xc3\xe1\x36\x49\x06\x65\x73\xf9\xb8\x4b\x1b\x7f\x1e\x19\x43\xed\xf7\x54\xcc\x06\x01\x04\xf2\x70\xb8\x85\x95\x08\x83\x86\xbe\xc2\xed\x0d\x99\x2e\x3d\x3e\xb7\x7a\xdd\xac\xc3\xbd\x00\x92\x64\xa0\x09\x0d\x22\x9a\x03\xfd\x33\x55\xec\x78\x4e\x51\xb2\xa1\x8e\xab\x79\xd3\x51\xdc\xab\xe8\xa0\x9e\x39\x56\xa8\x72\x54\xd9\x43\xcc\xd9\x6d\x3a\x5f\x4e\x77\x45\xa2\x36\x7d\x7d\xaf\x98\xaf\x71\x9c\xfb\x51\x50\x60\xa8\x4d\xac\x2e\x7b\x7d\x34\x03\xb9\x5f\xf5\xff\x62\x8e\x68\xf4\x79\x98\x9f\x7c\xdd\x09\xde\x0d\x73\x7f\xce\x19\x4e\xbc\x19\x31\x24\xc3\xe7\x78\x73\x32\xcd\x3a\xe7\x24\x87\x50\x85\xde\xf9\xdc\x9c\xc3\x88\x7c\x06\x68\x7b\xf3\x21\x2c\x90\xd7\x86\x4e\x32\x88\xed\xd7\x3f\x7f\x9d\xbf\x35\x3a\x2e\x74\xad\xf2\x34\xe0\x0d\x91\x2a\xea\x00\x05\xba\x68\x0c\xde\xae\x64\xb6\x82\x2d\xcf\xef\x09\x57\xee\xeb\x46\xb7\x42\xc8\x6a\x63\xc8\x30\x8d\x82\xcd\x38\x81\x93\x94\xff\x4d\x1c\x84\x65\x5d\xc8\x7e\x93\xcb\x82\x30\x6d\x4a\xc3\x18\x33\x36\x09\xf6\xab\xdc\x4c\x40\x6f\x12\x66\x90\x3b\xfc\x7c\x06\xa2\xe8\x97\xbe\xed\xb1\x11\x0e\xd3\xee\x08\x42\x40\x18\x6c\x6d\xfd\xac\xf3\x74\xc8\xa5\xc1\xcc\x05\xef\x37\x7e\x0e\x3c\x36\x61\x7f\x73\x75\x75\x79\x75\x1d\xc1\xfd\xf2\xf4\x1f\xf0\xe4\x70\x67\xe1\xe5\xcb\x81\xf4\x63\xcc\xf1\x45\x5b\x2b\xbd\x55\x29\x55\x0a\xe3\x57\x9d\xa8\xc8\x54\x61\x57\x02\xdd\xe8\x1c\xb4\x2a\x76\x60\xeb\xca\xbf\x03\x3d\xe3\x81\x6b\x62\x77\xd6\x61\x09\x73\xa9\x72\xa9\x96\x16\xb4\x81\xa5\x74\xab\x7a\x9e\x64\xba\x6c\xc7\xcd\xc3\xf9\xd2\x98\x26\x67\x66\x06\x85\x8b\xc1\xe4\x77\x39\x60\x92\x23\xb7\xdc\x4a\xb7\x02\x7e\xd0\x83\x12\xad\x15\x4b\x7c\x41\x8b\x68\xcc\xe1\xc0\x63\x6d\xbf\x96\xe9\xdc\x2f\xd0\x8f\x91\x6e\xa6\x07\xc9\xdf\x95\x41\x48\xf9\x9d\x9b\xf2\x17\x41\x5a\x20\xe6\xa9\x54\x1b\xbd\x8e\x01\xfa\x91\xc3\x16\x85\x0b\x4f\xc6\x17\x92\xb6\xc1\x76\xc5\x4f\x43\x01\xa9\xf3\xcf\x72\x61\xe9\xaf\x41\xbb\xc6\x5d\x3b\x43\xa1\x7a\x57\x38\x6d\x86\xe6\x43\x2d\x0d\x8f\x1b\x3e\x35\xc6\xbc\x25\x7f\x0c\x7c\x46\x65\x36\x43\xc6\x54\x69\xe7\x83\x5d\x44\xe0\xdb\xfe\x34\x92\x63\x35\x53\x53\xbf\xcb\xe3\xc0\x7e\x45\x3d\x26\x94\xab\xf7\x52\xda\x52\xb8\x2c\x56\xbe\x93\x82\xad\x7b\xd0\x86\x9c\x45\xe4\x4d\x3c\x95\xea\x74\xec\xed\xd7\x03\x06\xc8\x35\xfa\xc1\x12\x0b\xe1\x63\xe5\xf0\x46\x44\x65\x8f\xc9\xd1\x94\xd5\xaf\x36\x6a\x0c\x2b\x11\xfa\x7f\x72\x2f\x51\xc8\x98\xd9\x2e\xfc\x2a\x5d\xf3\x70\x24\xed\x40\x93\x64\x85\xdf\x84\xa5\x7b\x75\x3c\x42\xa5\x0d\x63\x17\xfc\x3e\xcc\x7b\xfc\xcf\x29\x76\x6e\x20\x8e\x98\xfa\xea\x21\x80\x4e\xec\xca\x57\xc1\x23\x7a\x62\xc1\x4f\x79\xbc\x29\xf1\x8b\x43\x65\x1b\xd0\xf8\x85\x73\x18\xa9\xf3\x35\xaa\xd8\x74\x89\xb1\x01\x66\x77\x95\x97\xe8\xdf\x35\x43\xec\xed\x86\xc8\x61\x58\xd3\x65\x32\xca\x6f\x32\xeb\x5d\xdf\xc9\x36\xf5\xd0\x53\xaf\x31\xdf\x9e\x56\x5a\x04\xdf\x91\xc2\x5c\x17\x92\x19\x3b\x2b\x0b\xb5\x6b\x7d\x83\x82\x48\xef\xd8\x47\xed\x1a\x86\xa8\x2d\x84\x51\x35\x6a\x53\x3c\xdc\x73\xfd\x60\x2b\xb4\xd0\x37\x57\xbf\x32\x02\x1e\x75\xf1\x55\xfa\x74\xd4\x63\xdf\xfa\xc7\xea\x29\x40\x4a\x51\x2c\xb4\x29\xa3\x96\x7b\xdb\xac\x0f\x21\x48\xe0\x83\xd9\x81\x58\x0a\xa9\xc6\x5a\x7a\x63\xd2\xdf\xad\x56\x6d\xb0\xcd\xca\x7c\xe0\x4d\xf3\xef\xd7\x97\xef\x40\xaa\xaa\x76\x90\x0b\x27\xe0\x6d\xb0\xc6\x93\xac\xcc\x9f\x50\xe8\x1d\x96\x24\x2a\xd9\x4d\xe0\xbd\xd3\x68\x93\x5a\xfc\x57\x8d\x2a\x3a\x22\xf7\x9f\x83\x3c\xbb\x0e\x54\xc7\x97\xa5\x17\xdf\xbd\x3f\x1f\xc5\xb0\x19\x4f\xbd\x79\x43\x25\x89\x3a\x13\xca\x97\x22\x73\xf4\xc5\x00\xe6\x30\x17\x16\x73\xd0\xaa\xe7\x64\xcf\x1a\x48\xf7\xf0\x4c\xe0\x7d\x81\xc2\x22\xd4\x55\x2e\x1c\x9e\x04\x4d\x4e\x9e\x59\x51\xe7\xa7\x38\x85\x05\x01\x5b\x9c\x9f\x4a\x18\x3d\x9d\x60\xa7\x61\x07\x7d\x75\x4f\x1c\x21\xd3\x84\x5d\x09\x5c\x38\xdf\x7d\x69\xb7\xe2\x5c\xcc\xb7\x6a\x51\xab\x70\xa7\x9a\x8b\x37\xf3\xd6\xd1\x0a\xc3\x83\x64\x49\x5c\xf0\x4b\x85\xd9\x94\x9b\x14\xb0\x36\x47\xdc\xc4\x07\x0a\x8c\x29\x49\xfd\x4a\xf4\x0c\xbc\x0b\x12\xc4\x56\xd7\xae\x1f\x2c\x12\xf8\xd8\x05\xe1\x26\x54\xd0\xb6\x59\x1b\x4e\xc8\x61\x9a\x62\x61\x24\xad\x05\x75\x1a\x33\xa5\xd4\xad\x38\x4c\x73\x69\x26\x05\xb9\x7b\xd5\x22\x3d\x5a\xbb\x57\x5a\x2a\x5f\x52\xf9\x16\xcd\x61\x68\x0c\xa8\x90\xe9\xae\xf3\x8c\x5a\xc0\x46\x2b\xcb\x3d\xc5\x71\x84\x1b\x56\x23\x13\xd4\xb0\x8b\x0d\xa6\xb9\xce\xd6\x18\xfb\x74\xed\x07\xa1\x98\xab\xd8\x20\xbc\x66\x42\x90\x25\x17\xe0\x23\x85\xa5\x2c\x30\x15\x85\x41\x91\xef\x52\xfc\x22\x6d\xf4\xd5\xff\x47\xba\x21\x81\x12\x3c\x65\x84\xf7\xc7\x57\x57\xef\x2e\xde\xfd\x34\xbd\xd9\x69\x36\x3c\xac\xdd\xd9\x0a\xa3\xda\x89\xaa\x41\x17\x2d\x31\xaf\x68\x8d\x0e\xea\x53\x33\x4a\xbd\x05\xb1\x70\x68\x7c\x79\xfb\xc2\xe7\x1f\x4a\x9a\xb7\x43\x77\x24\xc8\xe3\xa7\xa5\x07\x67\x9c\xfe\x37\x1a\xbd\x0a\x13\x72\x74\xe3\xb7\x93\x25\x53\x51\x9d\x63\x65\x30\xa3\xc0\x97\x1a\xac\x0a\x91\x45\xdd\x97\xaa\x4e\x92\xa3\x8b\x3c\xd4\xd2\xfc\x92\xe7\xe3\xe4\xf1\x08\x79\x2b\x8b\x02\xac\xd6\x8a\xe2\x6a\x27\x61\x06\x55\x08\x95\xd6\x37\x13\x3c\x04\xc0\xed\x11\x3b\xeb\x50\x4c\xc4\x1e\x2c\x71\x4e\x1b\x60\x57\xba\x2e\x72\x82\x67\xd1\x25\x70\x63\xfd\x3c\xcc\x37\xeb\xfc\x3a\xc6\xd4\xfc\x6b\x7c\x10\xde\x22\x62\xfa\x91\xa3\x24\x5c\x5e\x02\x55\x7c\x77\xdb\x13\xba\x74\x3e\xce\x3d\x40\x24\xc7\x1f\xb1\x19\x3c\xbc\x31\xa1\xbc\xbf\x39\xd0\x66\xf0\xd2\x7c\xff\xd6\xff\xf0\x6d\x1c\x58\x21\x4b\xe9\x52\xb9\x54\xda\x44\x21\x35\x2e\x1d\x82\x33\x6f\x61\x54\xfc\xeb\xb4\x05\xa1\xf0\xef\xd9\x4d\x95\x9e\xad\x84\x5a\xa2\x98\x47\xbf\xb3\xf9\xb5\x95\xd8\xf6\x3c\xb6\xd1\xbb\xd8\xf9\x99\x5b\xcb\x23\x81\x0b\x12\x4f\x7d\xe3\x04\x5f\x60\x04\x36\x2d\xf4\x32\xb5\xf2\x8f\x18\x80\x42\x2f\xaf\xe5\x1f\x9c\x5a\xfd\x86\x23\x8d\x3b\x17\x15\x8a\xdf\x50\xa9\xc7\x6e\x3e\x04\x7c\xce\x09\xfb\xbb\xe7\x93\xa1\x94\x58\x6a\xb3\x1b\x42\xe3\x29\xce\x05\xf4\xdd\xf7\xff\xcf\x90\xfe\xef\xbb\xef\x27\x63\xa2\xfc\xab\xeb\x58\xcf\x12\x56\xcf\x02\xf3\xdc\xdb\xe7\x7f\x9f\xd3\x3f\xe3\x78\x78\xfc\x94\x56\x46\x57\x68\x9c\xc4\x58\xbe\x6a\x22\x60\x2f\x5e\xf9\xa1\xa5\x33\x12\xdb\xb1\xa5\x9f\x65\x75\xcc\x9a\xf1\xe6\xfd\x31\xb1\x09\x89\xb9\x66\x87\xa3\xc8\x28\x1d\xe8\xda\x59\x99\xf3\x41\x7c\x30\x62\x23\x2d\xcc\x6b\x59\xe4\xc3\xb3\x2f\x56\xc5\x87\x03\x43\x6e\x3b\x29\x14\xb4\xde\x7f\x14\x10\xd4\x49\x40\x0f\xd6\xe6\x89\xde\x7e\x9f\x84\xbf\x36\xe6\xde\xef\x93\x52\xaa\x30\xdf\xa1\xff\x10\xd9\x48\xb7\xc8\x50\x9b\x72\xd0\x5f\xb2\x58\x98\x68\x3a\xf0\x40\x45\xa5\xd1\x49\x33\x7e\x4f\xc1\x1e\xed\xb7\xcf\x6a\xb2\x19\x6d\x18\xe1\xf1\x7c\x66\xb0\xaa\xb9\x33\x9d\x39\x0a\x31\x27\xe5\x4e\xd3\x3c\x58\x2c\x30\xa3\xd2\x55\xbb\x15\xfa\xd1\xef\x38\xa4\x66\x22\x3a\x3a\xa0\x0a\xa9\xf0\x64\x98\xd3\x14\x0c\x99\x56\x4e\xf0\xf7\x64\x4a\x4f\x9b\xb2\xb2\xf4\xde\x03\x07\x1b\x65\x0a\x88\x7b\xc7\xff\x21\xe3\x9c\x8e\xac\xb6\x61\x0a\xe0\x67\x69\x81\xe8\xb8\xf5\x1a\xb7\x50\xef\x03\xc5\x54\x6f\xd0\x18\x99\xe7\x18\xfb\xec\x97\x10\xf6\xbf\x57\xec\x1e\xa8\xba\xad\x4d\xad\xd0\x7f\x7f\x98\x7a\x50\xa9\xb4\x69\x55\xcf\x0b\x19\xfb\x12\xdb\x9f\x0a\xd3\x36\xbd\xac\xff\x24\x53\x58\xf0\x1b\xef\x8c\xe5\x66\x14\x2e\x38\xb6\xcc\x11\x36\xd2\xca\x79\xe1\x9b\x39\x6a\x6d\x29\x3a\xf2\xcb\x1a\xb5\xb5\x3b\x6a\x8c\xb4\x1a\xf8\xc4\x91\xb1\x86\x26\x67\x8b\xf3\x14\xbf\xf0\x17\x27\xc3\x69\xfc\x6e\x3b\xc3\x4d\x25\xb7\xb6\x2a\xa7\x7f\x3f\xf5\x7c\xee\x74\x95\x74\x11\xc8\x94\x5b\x9c\xcf\x7c\x72\x0f\xff\x15\x36\x0c\xf4\x19\x1e\x69\x6f\x7a\x40\x70\x3d\x8a\x07\xf6\x94\xe4\x61\xfd\x46\x7c\xd2\x88\xc0\x7f\x36\xd1\x6d\x4a\xe0\x07\xad\x36\x14\xee\x43\x4b\xd0\x89\x70\xfa\x88\xfd\xb8\xcb\x9e\x6a\x35\x32\x0d\x39\x1a\x83\x34\xb4\x77\x74\x6b\x16\x1e\xa8\x5d\x3b\x94\x38\xd5\xaf\x2f\xa8\xd5\x70\x74\x84\xf1\xfa\xcd\xdf\x6e\x7e\x9a\xdc\xc2\x31\xf5\xc3\xfa\xb7\x7c\xbe\x4c\x2d\x0a\x93\xad\xc8\x7a\xcd\xe5\x6f\x5b\xe8\xa8\x09\xc3\x8e\xf6\xf2\x1f\x37\xdd\x4d\x9c\xa4\xdc\xd1\x25\xc9\x91\x32\x90\xa0\x9c\x46\xc8\x3f\x3b\x3a\x9e\x19\x19\x09\x5a\x9b\x3a\xfc\x23\xee\xc0\xff\x99\xf3\xfa\x9e\x97\x84\x60\x91\x17\xf0\x23\x23\xe8\xfe\x47\x10\x7e\xbc\x24\x66\x0f\x05\x30\xfc\x51\xf5\xc3\x31\xf4\xdf\x89\x9b\xef\x1a\x02\xa4\x47\xb7\x8f\xfe\x1d\x00\x00\xff\xff\x46\xeb\xca\x36\xce\x37\x00\x00")
+var _wski18nResourcesEn_usAllJson = 
[]byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x5f\x8f\xdb\x36\x12\x7f\xcf\xa7\x18\x04\x07\xa4\x05\x1c\x6d\xda\xc3\x01\x87\x00\x79\xc8\x35\x69\x9b\x6b\x93\x0d\x76\x93\x0b\x8a\xdc\x42\xa1\xa5\xb1\xcd\x5a\x22\x75\x24\x65\xc7\x5d\xec\x77\x3f\xcc\x90\x94\x64\xaf\xf5\xc7\x4e\x7a\x97\x97\x68\x97\xe4\xcc\x6f\x86\xc3\xf9\x47\xee\xc7\x07\x00\xb7\x0f\x00\x00\x1e\xca\xfc\xe1\x53\x78\x58\xda\x65\x5a\x19\x5c\xc8\xcf\x29\x1a\xa3\xcd\xc3\x99\x1f\x75\x46\x28\x5b\x08\x27\xb5\xa2\x69\x2f\x79\xec\x01\xc0\xdd\x6c\x80\x82\x54\x0b\xdd\x43\xe0\x15\x0d\x8d\xad\xb7\x75\x96\xa1\xb5\x3d\x24\xae\xc3\xe8\x18\x95\xad\x30\x4a\xaa\x65\x0f\x95\x0f\x61\xb4\x97\x4a\x56\xe6\x69\x8e\x36\x4b\x0b\xad\x96\xa9\xc1\x4a\x1b\xd7\x43\xeb\x8a\x07\x2d\x68\x05\x39\x56\x85\xde\x61\x0e\xa8\x9c\x74\x12\x2d\x7c\x23\x13\x4c\x66\xf0\x56\x64\x6b\xb1\x44\x3b\x83\xe7\x19\xad\xb3\x33\x78\x67\xe4\x72\x89\xc6\xce\xe0\xaa\x2e\x68\x04\x5d\x96\x7c\x0b\xc2\xc2\x16\x8b\x82\xfe\x37\x98\xa1\x72\xbc\x62\xc3\xdc\x2c\x48\x05\x6e\x85\x60\x2b\xcc\xe4\x42\x62\x0e\x4a\x94\x68\x2b\x91\x61\x32\x59\x16\xad\xfb\x24\x79\x0e\x4e\xeb\x02\x9c\x0e\x82\xcc\xa0\x56\xfe\x0b\x84\xca\xc1\xee\x54\x06\xba\x42\xb5\x5d\x49\xbb\x86\x2a\xc8\x04\xb5\x95\x6a\x09\x02\x4a\xa1\xe4\x02\xad\xe3\xc9\xba\x22\xaa\xa2\x08\xa4\x4a\x92\x64\x21\x8b\x66\xfa\x6f\xcf\x5f\xff\x3a\x05\xb3\x5d\x69\xe3\x86\x37\xe0\xad\xd1\x1b\x99\xa3\x05\x01\xb6\x2e\x4b\x61\x76\xe0\xe7\x83\x5e\xc0\x76\x25\xdc\x23\x0b\x73\xc4\xce\xf6\x7c\x99\x1a\x03\xa4\x51\x3d\x5a\x74\xa4\xcb\x15\x16\x55\x60\x0d\x3b\x5d\x9b\x49\x2a\x24\x55\x4d\xc7\xb2\x41\x63\x89\x77\x9f\x7e\xa4\x72\x2c\x70\x98\x07\xaa\x2e\xe7\x68\x58\x3d\x76\xed\xa1\x4d\xe6\x45\x56\x30\x6a\x3f\x6c\x2a\x2c\xec\x65\x85\xea\xc3\xbe\xb0\x73\x74\x5b\xda\x8e\xac\x90\x64\x15\x6c\x5a\x68\x36\x68\x26\xdb\xf0\x74\x0c\x1d\xeb\x23\x3e\xd1\x9e\xf9\x17\x7a\xf1\xbf\xb4\xe6\x45\x21\x96\xa9\xa8\x64\xba\xd2\xb6\xcf\x70\x3c\x94\xe7\x6f\x5f\xc1\xa7\x9f\x2f\xaf\xdf\x7d\x9a\x48\x71\x78\xfb\x3b\x44\xff\xf5\xf2\xea\xfa\xd5\xe5\x9b\x49\x74\x6b\xb7\x4a\xd7\xb8\xeb\x21\x4a\xc3\xda\xc8\x3f\xf8\x17\xf0\xe9\x97\x97\xbf\x4d\x21\x9a\xa1\x71\x29\xe9\xad\x87\x6a\x25\xdc\x8a\xb6\x85\x6c\x35\xa1\xc9\xac\xe4\x29\x84\xb5\x5a\xc8\x3e\x67\xef\x07\x99\x14\x7c\x93\xe3\x42\xd4\x85\x03\x69\xe1\x2f\x3f\x5f\xbe\x7e\x79\x91\x6c\xed\xba\x32\xba\xb2\xdf\x4e\xd1\x4a\x51\xe8\x6d\x1a\x68\xf4\x85\x28\x9e\x04\xcd\xa4\x71\xaa\xad\x51\x0d\xe9\xa5\x71\xcb\x8d\xf5\x4d\x20\x5d\x19\xdc\x48\xdc\xf6\xd0\xb5\x2b\x06\x1a\x89\x5e\xec\x1d\x8f\xaa\x10\x6a\x02\x87\x35\xee\x26\x6f\xe9\x1a\x77\x53\x81\x7b\x4d\x97\x42\x89\x25\xe6\x83\x8a\xae\x8c\xfe\x1d\x33\xd7\xc6\x5c\xa7\x61\x8e\x50\x0a\xb3\xc6\x1c\x22\x85\x29\xaa\x62\x3a\x29\xc5\x82\x3e\x61\x02\x2b\x9e\x32\x4e\x31\xba\x90\x91\x5d\xdd\x73\xfa\x13\xc8\x36\xc1\xaa\x87\x6e\x3b\x3e\x59\xe8\x11\x84\xde\x3d\x17\x68\x6d\xd4\xf6\x04\xd2\xd6\x19\xd9\x4b\xd9\x6f\x5d\x6d\xd1\xd0\x41\x91\x0a\x73\x30\xb5\x72\xb2\x6c\x82\xd4\x04\x0e\xce\xf4\x2b\x81\xc7\x40\xd7\xae\xaa\xa7\x80\xf5\xe6\xb6\x41\x33\xd7\xb6\x8f\x64\x18\x1d\x27\xca\xfe\x26\x2d\xa5\xa5\xd8\xc0\x9e\xb4\xdf\x91\xbe\x5b\x21\xd0\x0c\xb2\xde\xcc\x7b\x53\x3a\x25\xd2\x82\xd2\x0e\x3c\xa9\xda\x60\x9e\xfc\x7b\x48\x23\x07\x1c\x2b\x39\x10\x64\x88\x23\x45\x03\x9a\xf2\x65\x7c\xc6\x0c\x91\x38\x35\x73\xce\x63\x15\x44\x19\x2a\x2a\x0e\xe5\xf9\x78\x7b\x9b\xd0\xf7\xdd\xdd\xcd\x0c\x16\x46\x97\x70\x7b\x9b\x58\x5d\x9b\x0c\xef\xee\x26\xf1\xf4\x1b\x36\xc6\x93\xa6\xc5\xbd\xb2\xe8\xce\xe3\xd5\xa8\x67\x8c\xdb\x9e\x1e\x49\xc4\xe6\x17\xe7\xcb\x59\xc9\xe5\x36\x15\x5c\x4f\xa5\x4e\xaf\x51\x8d\x8a\x4c\x2b\xc0\xaf\x00\x5e\x71\x9e\xf0\xb5\x2a\x85\xb1\x2b\x51\xa4\x85\xce\x44\xd1\xc3\xf1\x7d\x9c\xd5\x49\x22\x83\x93\xb0\x9e\x1f\xaf\x86\x8d\x28\x6a\xb4\x13\x19\x2a\x74\x5b\x6d\xd6\x67\xb3\x94\xca\xa1\x51\xe8\x40\x38\x12\xb7\x36\xc5\x88\xac\x6d\x44\x4d\x33\xa1\x32\x2c\x8a\xde\x78\x76\xf9\x4b\x02\x3f\xf8\x39\x94\x54\xb6\x2b\xa7\x32\x58\x08\xd9\x4f\xfd\x45\x1b\xda\x73\x99\x87\xb3\x58\x56\x05\x3a\x04\x5b\xd3\x96\x2e\xea\xa2\xd8\x25\x70\x55\x2b\xf8\xd4\x14\x06\x4d\xce\xfc\x89\x22\x81\xc1\x52\x6f\x10\x2a\x61\x9c\x14\x45\xb1\x6b\x6b\x2a\x61\x2d\xba\xe1\x5d\xe8\x20\xf5\x05\x5a\x6a\x9d\x70\x75\x5f\x1e\xf5\xf8\xf1\xe3\xc7\xcf\x9e\x3d\x7b\xd6\xd9\x8b\x8e\x0c\xd7\xbc\x14\x68\x02\x4d\x9c\xc4\x95\x5b\x0b\x98\x4f\x51\x51\x54\x4d\x0e\xa1\x1f\xe1\x95\x33\x6c\x64\xe7\xef\x75\x77\xed\x74\x26\x83\xfb\xfd\xbe\x9b\xcc\x0d\xee\xf8\x64\x7e\x63\xfa\xdb\x63\x79\x86\x06\x33\x5d\x96\x42\xe5\x29\x17\x55\x9c\x55\x92\x97\x4b\x85\x4b\x29\x13\xe9\x61\x7a\x7b\x9b\x64\x65\x7e\x77\x17\x4a\xb1\xdb\xdb\x84\x16\xba\x5d\x85\x77\x77\xec\x29\x69\xed\xdd\xdd\x4d\x92\x0c\xf2\xe6\xf4\x71\x97\x46\x7b\x1e\x69\x43\xdd\xde\x52\x32\x1b\x18\x10\xc8\xbb\xbb\x1b\x58\x89\xd0\x68\xe8\x0a\xdc\x9c\x90\xe9\xdc\xfb\xfb\x56\x2f\xe2\x38\x1c\x05\x90\x24\x03\x45\x68\x60\x11\x37\xf4\x6b\x8a\xd8\xd2\x9c\x22\x64\x9c\xdd\x2f\xe6\xfb\x76\xc6\x51\x41\x07\xe5\xcc\xb1\x42\x95\xa3\xca\x4e\x51\x67\xbb\xe8\x7c\x3e\xed\x11\xe9\xd5\xe9\x8b\xa3\x6c\xbe\xc4\x70\x8e\xa3\x20\xc7\x50\x9b\xbe\xbc\xec\xc5\x5e\x0f\xe4\xb8\xe8\xff\xc7\x18\x11\xe5\x39\xcd\x4e\xbe\x6c\x07\xef\xbb\xb9\xaf\xb3\x87\x13\x4f\x46\x1f\x92\xe1\x7d\x7c\x7f\xd0\xcd\x3a\x67\x27\x87\x50\x85\xda\xf9\xdc\x98\xc3\x88\x7c\x04\x68\x6a\xf3\x21\x2c\x90\xd7\x86\x76\x32\xb0\xed\xe6\x3f\x7f\x9e\xbd\x45\x19\x17\xba\x56\x79\x1a\xf0\x06\x4f\xd5\x6b\x00\x05\xba\x5e\x1f\xbc\x5d\xc9\x6c\x05\x5b\xee\xdf\x13\xae\xdc\xe7\x8d\x6e\x85\x90\xd5\xc6\x90\x62\xa2\x80\xb1\x9d\xc0\x41\xca\x7f\x13\x05\x61\x59\x16\xd2\xdf\xe4\xb4\x20\x74\x9b\xd2\xd0\xc6\xec\xeb\x04\xfb\x51\x2e\x26\xa0\xd3\x09\x33\xc8\x15\x7e\x3e\x03\x51\x74\x53\xdf\x66\xdb\x08\x87\x69\x56\x04\x26\x20\x0c\x36\xba\xbe\x68\x2d\x1d\x72\x69\x30\x73\xc1\xfa\x8d\xef\x03\x8f\x75\xd8\x5f\x5e\x5d\x5d\x5e\x5d\xf7\xe0\x7e\x76\xf8\x0f\xfc\x74\xb8\x37\xf0\xec\xd9\x40\xf8\x31\x66\xff\xa0\xad\x95\xde\xaa\x94\x32\x85\xf1\xa3\x4e\xb3\x48\x55\x61\x55\x02\x6d\xeb\x1c\xb4\x2a\x76\x60\xeb\xca\xdf\x03\x5d\x70\xc3\x35\xb1\x3b\xeb\xb0\x84\xb9\x54\xb9\x54\x4b\x0b\xda\xc0\x52\xba\x55\x3d\x4f\x32\x5d\x36\xed\xe6\xe1\x78\x69\x4c\x8c\x99\x99\x41\xe1\xfa\x60\xf2\xbd\x1c\xf0\x94\x3d\xb3\xdc\x4a\xb7\x02\xbe\xd0\x83\x12\xad\x15\x4b\x7c\x4a\x83\x68\xcc\xdd\x1d\xb7\xb5\xfd\x58\xa6\x73\x3f\x40\x1f\x23\xd5\x4c\x07\x92\x3f\x2b\x83\x90\xf2\x7b\x27\xe5\x4f\x82\xb4\x40\xcc\x53\xa9\x36\x7a\xdd\x07\xe8\x47\x76\x5b\xe4\x2e\xfc\x34\x3e\x90\xb4\x0c\xb6\x2b\xbe\x1a\x0a\x48\x9d\xbf\x96\x0b\x43\x7f\x0e\xda\x35\xee\x9a\x1e\x0a\xe5\xbb\xc2\x69\x33\xd4\x1f\x6a\xe6\x70\xbb\xe1\x63\x54\xe6\x0d\xd9\x63\xa0\x33\xca\x33\x36\x19\x53\xa5\x9d\x77\x76\x3d\x0c\x5f\x77\xbb\x91\xec\xab\x79\x36\xd5\xbb\xdc\x0e\xec\x66\xd4\x63\x4c\x39\x7b\x2f\xa5\x2d\x85\xcb\xfa\xd2\x77\x12\xb0\x31\x0f\x5a\x90\x33\x8b\x3c\xfa\x53\xa9\x0e\xdb\xde\x7e\x3c\x60\x80\x5c\xa3\x6f\x2c\x31\x13\xde\x56\x76\x6f\x34\xa9\xec\x10\xd9\xeb\xb2\xfa\xd1\x28\xc6\xb0\x10\xa1\xfe\x27\xf3\x12\x85\xec\x53\xdb\x2b\x3f\x4a\xc7\x3c\x6c\x49\xd3\xd0\x24\x5e\xe1\x9b\xb0\xb4\xb7\x8e\x7b\xa8\xb4\x61\xec\x82\xef\x87\x79\x8d\xff\x9c\xa2\xe7\x08\x71\x44\xd5\x57\xa7\x00\x3a\xd0\x2b\x1f\x05\x8f\xe8\x91\x05\xdf\xe5\xf1\xaa\xc4\xcf\x0e\x95\x8d\xa0\xf1\x33\xc7\x30\x12\xe7\x4b\x44\xb1\xe9\x12\xfb\x1a\x98\xed\x51\x5e\xa2\xbf\xd7\x0c\xbe\xb7\x6d\x22\x87\x66\x4d\x1b\xc9\x28\xbe\xc9\xac\x73\x7c\x27\xeb\xd4\x43\x4f\xbd\xc4\x7c\x7a\x1a\x6e\x3d\xf8\xf6\x04\xe6\xbc\x90\xd4\xd8\x6a\x59\xa8\x5d\x63\x1b\xe4\x44\x3a\xdb\x3e\xaa\xd7\xd0\x44\x6d\x20\x8c\x8a\x51\x9b\xe2\x74\xcb\xf5\x8d\xad\x50\x42\xbf\xbf\xfa\x95\x11\x70\xab\x8b\x8f\xd2\xc7\xbd\x1a\xfb\xc6\x5f\x56\x4f\x01\x52\x8a\x62\xa1\x4d\xd9\xab\xb9\xd7\x71\x7c\x08\x41\x02\xef\xcc\x0e\xc4\x52\x48\x35\x56\xd2\x1b\x93\xfe\x6e\xb5\x6a\x9c\x6d\x56\xe6\x03\x77\x9a\xff\xbc\xbe\x7c\x03\x52\x55\xb5\x83\x5c\x38\x01\xaf\x83\x36\x1e\x65\x65\xfe\x88\x5c\xef\x30\x27\x51\xc9\xb6\x03\xef\x8d\x46\x9b\xd4\xe2\x7f\x6a\x54\xbd\x2d\x72\xff\x1c\xe4\xe2\x3a\xcc\xda\x3f\x2c\x1d\xff\xee\xed\x79\xcf\x87\xcd\xb8\xeb\xcd\x0b\x2a\x49\xb3\x33\xa1\x7c\x2a\x32\x47\x9f\x0c\x60\x0e\x73\x61\x31\x07\xad\x3a\x46\x76\x11\x21\x1d\xa1\x99\xc0\xdb\x02\x85\x45\xa8\xab\x5c\x38\x3c\x70\x9a\x1c\x3c\xb3\xa2\xce\x0f\x71\x0a\x0b\x02\xb6\x38\x3f\xe4\x30\xba\x3b\x41\x4f\xc3\x06\xfa\xfc\x88\x1f\x21\xd5\x84\x55\x09\xbc\x72\xbe\xfa\xd2\x6e\xc5\xb1\x98\x4f\xd5\xa2\x56\xe1\x4c\xc5\x83\x37\xf3\xda\xd1\x0a\xc3\x85\x64\x49\x54\xf0\x73\x85\xd9\x94\x93\x14\xb0\xc6\x2d\x8e\xfe\x81\x1c\x63\x4a\x5c\xbf\x10\x3d\x03\x6f\x9d\x04\x91\xd5\xb5\xeb\x3a\x8b\x04\x3e\xb4\x4e\x38\xba\x0a\x5a\x36\x6b\xdc\x09\x19\x4c\x4c\x16\x46\xc2\x5a\x10\x27\xaa\x29\xa5\x6a\xc5\x61\x9a\x4b\x33\xc9\xc9\x1d\x15\x8b\xe4\x68\xf4\x5e\x69\xa9\x7c\x4a\xe5\x4b\x34\x87\xa1\x30\xa0\x44\xa6\x3d\xce\x33\x2a\x01\xa3\x54\x96\x6b\x8a\x7d\x0f\x37\x2c\x46\x26\xa8\x60\x17\x1b\x4c\x73\x9d\xad\xb1\xef\xe9\xda\x0f\x42\x31\x55\xb1\x41\x78\xc1\x13\x41\x96\x9c\x80\x8f\x24\x96\xb2\xc0\x54\x14\x06\x45\xbe\x4b\xf1\xb3\xb4\xbd\xb7\xfe\x3f\xd2\x09\x09\x33\xc1\xcf\x1c\xa1\x9d\xcb\xc5\x02\xa9\x20\x6c\xab\x12\x89\xd6\x1b\x94\xa5\xcc\xa9\x10\x73\xec\xbb\x1c\xb9\x54\x08\x64\x87\x05\x1e\x96\xfd\xed\x8f\x71\x4b\xdc\x56\x43\xc3\x8c\x2f\x4d\xbc\xae\x69\x76\xfc\xc9\x3b\xd6\x95\xb4\xb0\x96\x2a\xa7\x03\x12\x6c\x31\x5c\x4a\xde\x0b\x3c\x07\x9e\x82\xfc\x4b\x07\x08\x43\x3f\x02\x27\xbc\xbc\xba\xe7\x57\xd8\x58\xf8\xaa\x99\x72\xb7\x08\x0a\x62\x59\x83\x2c\x83\xc5\x4a\x18\xfa\x81\xa9\x5b\x9f\x33\x1d\x97\x6d\x9a\xf1\x87\x43\x96\x92\xc8\xa7\xda\xb9\xd2\x5e\x53\x16\xdd\x69\xcc\x4e\xf5\x15\x81\x59\xe7\xbc\x8f\xf0\x8b\xde\x37\x5d\x89\x0d\x79\x2a\xb6\x25\xdf\x48\xb7\x01\x4c\xdf\xe3\xca\x6e\x18\x8a\x64\x82\xbf\x8a\xa6\x1d\xaf\xeb\xc9\xe7\xab\xe8\x8c\x7c\xa1\xcf\xa9\x18\xed\x5f\xa8\x6e\x93\xf8\xda\x31\xbc\xf1\xf2\xf4\x2c\x07\x2a\x32\xa6\x15\x9d\x46\x5e\xc0\x19\xbb\x54\x20\xa2\x4d\x47\x0a\x23\x87\x5f\xab\x45\x21\x33\xf2\x32\x69\x28\xdc\x48\x42\xa3\xad\x8d\x9d\x90\xbe\xe3\xda\x39\x3f\xb1\xe4\x23\xa1\xc3\x77\x90\x39\xca\xca\xc9\x6f\x59\x17\x4e\x56\x85\xaf\x1a\xfd\xe1\xa1\xaf\x90\x91\x78\xe6\xec\xbe\x62\xec\x3d\x68\x83\xb8\xee\x2d\xee\x0c\xa4\xf3\x27\xaa\xd2\xd6\xca\xb9\x3f\x05\xac\x90\x28\x88\xe7\xda\xaa\x67\x4e\x79\x49\x63\xe9\x0c\xe2\xde\x21\x0c\x92\x30\x9b\x7b\x45\xcf\x09\xca\x34\x75\x81\x67\x68\x92\x96\x85\xea\xa2\xc0\x63\x3a\x6c\xf1\x47\x7f\x7f\x90\x48\xa8\xfc\x82\x0e\x75\x54\xc1\xfe\x96\x24\xfe\xa9\xec\xd7\x50\x32\x0b\x78\x4c\xc3\xc2\x5a\x9d\x49\x26\x7d\x1c\xf1\x45\x04\x77\xa8\x7c\x16\xfe\x24\xcd\x7f\x78\x7e\xf5\xe6\xd5\x9b\x9f\xa6\x77\xbd\xe2\x82\xd3\xfa\x5e\x5b\x61\x54\x73\xb5\x66\xd0\xf5\xf6\x1a\xae\x68\x8c\x22\xf6\xc7\x78\xa7\x76\x03\x62\xe1\xd0\xf8\x3e\xc7\x53\x5f\x88\x50\xf5\x74\x33\x94\x2c\x05\x7e\xfc\xc6\xe0\xe4\xd2\xa3\xfb\x58\xaf\xd3\x6a\x80\x1c\xdd\x78\x9a\xc6\x9c\xd7\xc8\x57\x21\x06\x33\xda\xc5\xd4\x60\x55\x88\xac\x37\x8f\x79\xb7\xf2\x7c\x74\x91\x87\xa6\x0a\x3f\xe9\xf0\x61\x6a\xff\x2e\x71\x2b\x8b\x02\xac\xd6\x8a\x12\xec\x96\xc3\x0c\xaa\x60\x07\xd6\x87\x41\xee\x06\xe3\x76\x8f\x9c\x75\x28\x26\x62\x0f\x9a\x38\xa7\x1f\x64\x57\xba\x2e\x72\x82\x47\x51\x09\xde\x5b\x7f\x31\xe2\xbb\xb6\xfc\x4c\x82\x67\xf3\xd7\xf8\x8d\x68\x83\x88\xe7\x8f\x6c\x25\xe1\xf2\x1c\x28\x2a\xdf\xef\x53\xd1\x29\xf4\x09\xef\x09\x2c\x39\x11\x15\x9b\xc1\xcd\x1b\x63\xca\xeb\xe3\x86\xc6\x0e\x7c\x7c\x08\xdd\x7d\x01\x3d\x0e\xac\x90\xa5\x74\xa9\x5c\x2a\x6d\x7a\x21\x45\x93\x0e\x81\x91\x97\xf8\x44\x8b\xbe\x0e\x7b\x51\x54\x07\x78\x72\x53\xb9\x67\x2b\xa1\x96\x28\xe6\xbd\x0f\x2e\x7f\x6d\x38\x36\xcd\x2f\x1b\xe5\x2e\x76\xfe\xf2\xa5\xa1\x91\xc0\x2b\x62\x2f\xd5\x72\x8a\x2d\x30\x02\x9b\x16\x7a\x99\x5a\xf9\x47\x1f\x80\x42\x2f\xaf\xe5\x1f\x5c\x63\xf9\x05\x7b\x12\xb7\x26\x2a\x14\x3f\xa6\xa1\x78\x15\x5f\x84\x3f\xe1\x44\xe1\xbb\x27\x93\xa1\x94\x58\x6a\xb3\x1b\x42\xe3\x67\x9c\x0b\xe8\xbb\xef\xff\xce\x90\xfe\xf6\xdd\xf7\x93\x31\x51\x21\xa6\xeb\xbe\xe6\x55\x18\x3d\x0b\xcc\x13\xaf\x9f\xbf\x3e\xa1\x7f\xe3\x78\xf8\x1e\x22\xad\x8c\xae\xd0\x38\xd9\x1b\xbf\xa3\x07\xec\xf8\x2b\x7f\x7b\xe5\x8c\xc4\xe6\xfe\xca\x5f\x6a\xb4\xc4\xe2\x3d\xd7\x71\x9f\x18\x5d\x62\xae\xd9\xe0\xc8\x33\x4a\x07\xba\x76\x56\xe6\xbc\x11\xef\x8c\xd8\x48\x0b\xf3\x5a\x16\xf9\xf0\x25\x08\x8b\xe2\xdd\x81\x21\xb3\x9d\xe4\x0a\x1a\xeb\xdf\x73\x08\xea\xc0\xa1\x07\x6d\xf3\xd5\x0e\x25\x1a\xfe\xb7\x51\xdd\xb7\xb7\x49\x29\x55\x68\xf4\xd3\x0f\x22\x1b\x69\x1b\x32\xd4\xd8\x17\xf0\x87\xac\xcf\x4d\xc4\x56\x6c\x98\x45\x79\xc9\x41\x57\xf6\x48\xe7\xa6\xb7\xf1\x7a\x56\xb7\x95\xd1\x86\xbb\x1c\xae\x0e\x06\xcb\xdb\x7b\x6d\xfa\x3d\x17\x73\x50\xf7\xc6\xcc\xc8\x62\x81\x99\x03\xa1\xb4\x5b\x85\xb4\x74\x1c\x52\x4c\x37\x47\x6f\x2a\xde\xdd\x2b\x24\xbb\x09\x43\xa6\x95\x13\x9c\x79\x2a\x3d\xed\xba\x8d\xb9\x77\x6e\xba\x59\x29\x53\x40\x1c\xbd\x07\x0e\x11\xe7\xf0\xee\x62\x1b\xda\xc1\xfe\x52\xe5\x58\x39\x3c\x41\x43\x9d\x97\xea\xa9\xde\xa0\x31\x32\xcf\xb1\xaf\xa8\x23\x84\xdd\x87\xeb\xed\x4b\x85\x76\x69\xcc\x15\xba\x17\xd1\x53\x37\x2a\x95\x36\xad\xea\x79\x21\xfb\xfe\x24\xc7\xef\x0a\xcf\x8d\x4d\x4d\xff\x36\x5f\x58\xf0\x0b\xef\x25\xcc\x94\xb9\x7b\xdf\x32\x47\xd8\x48\x9f\xbb\xd3\x39\xa4\xd2\x91\xbc\x23\x3f\xb1\xc0\x1c\xe6\x3b\x10\x6a\xa7\xd5\xc0\x5b\x77\xc6\x1a\x6b\x70\x9c\xa7\xf8\x99\x9f\x1e\x0e\x87\xf1\xfb\x25\x38\x77\x17\xb9\xc7\xa9\x72\xfa\xff\xb1\xa7\x73\xaf\xbd\x48\x07\x81\x54\xb9\xc5\xf9\xcc\x07\xf7\xf0\x53\x58\x30\x50\x85\x79\xa4\x9d\x36\x32\xc1\x1d\x2c\xd8\xfb\x9a\x8b\x64\x61\xdd\x8e\xec\xa4\x5e\xb1\x7f\x3f\xd7\x2e\x4a\xe0\x07\xad\x36\xe4\xee\x43\x49\xd0\xb2\x70\x7a\x8f\xfc\xb8\xc9\x1e\x4a\x35\xd2\x16\x1f\x6a\x44\xb4\xb2\xc5\x81\x13\xa5\x6b\xba\xd3\x87\xf2\x75\x19\x35\x12\x8e\xf6\xb2\x5f\xbc\xfc\xc7\xfb\x9f\x26\x97\x70\x3c\xfb\xb4\xfa\x2d\x9f\x2f\x53\x8b\xc2\x64\x2b\xd2\x5e\x3c\xfc\x4d\x2f\xb5\x57\x85\x61\x45\x73\xf8\xf7\xbb\xaf\xd1\x4f\x52\xec\x68\x83\xe4\x48\x1a\x48\x50\x0e\x3d\xe4\xd7\xf6\x8e\x67\x7a\x46\x82\xd6\x84\x0e\xff\x9a\x67\xe0\x4f\x34\x5f\x1c\xb9\x52\x0e\x1a\x79\x0a\x3f\x32\x82\xf6\x2f\x02\xb9\xb3\x40\xc4\x4e\x05\x30\xfc\xd7\x35\xa7\x63\xe8\x3e\x18\x8a\x0f\xdc\x02\xa4\x07\x37\x0f\xfe\x1b\x00\x00\xff\xff\x43\x2e\x8d\xa6\xd7\x3d\x00\x00")
 
 func wski18nResourcesEn_usAllJsonBytes() ([]byte, error) {
        return bindataRead(
@@ -112,7 +112,7 @@ func wski18nResourcesEn_usAllJson() (*asset, error) {
                return nil, err
        }
 
-       info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 
14286, mode: os.FileMode(420), modTime: time.Unix(1523039220, 0)}
+       info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 
15831, mode: os.FileMode(420), modTime: time.Unix(1523315322, 0)}
        a := &asset{bytes: bytes, info: info}
        return a, nil
 }
diff --git a/wski18n/resources/en_US.all.json b/wski18n/resources/en_US.all.json
index f7658201..5b322708 100644
--- a/wski18n/resources/en_US.all.json
+++ b/wski18n/resources/en_US.all.json
@@ -315,6 +315,30 @@
     "id": "msg_err_file_already_exists",
     "translation": "File already exists."
   },
+  {
+    "id": "msg_err_different_dependencies_with_same_label",
+    "translation": "One single dependency [{{.dependency}}] has two different 
locations [{{.location}}]. This kind of specification is not supported. Please 
update the dependency label [{{.dependency}}] in the manifest file to point to 
same location or create two separate labels for two different locations."
+  },
+  {
+    "id": "msg_err_action_without_kind",
+    "translation": "Action [{{.action}}] has no kind set."
+  },
+  {
+    "id": "msg_err_action_without_code",
+    "translation": "Action [{{.action}}] has no source code."
+  },
+  {
+    "id": "msg_err_sequence_having_same_name_as_action",
+    "translation": "Sequence [{{.sequence}}] is already defined as an action 
under the same package. Actions and sequences can not have same name in a 
single package."
+  },
+  {
+    "id": "msg_err_conflicting_triggers_across_packages",
+    "translation": "One single trigger [{{.trigger}}] is defined with multiple 
feeds [{{.feed}}]. Triggers are created directly under the namespace, its not 
possible to have triggers with same name but different feeds. Please update 
trigger names in manifest file."
+  },
+  {
+    "id": "msg_err_conflicting_rules_across_packages",
+    "translation": "One single rule [{{.rule}}] is defined with different 
actions [{{.action}}] and/or triggers [{{.trigger}}]. Rules are created 
directly under the namespace, its not possible to have rules with same name but 
associated with different actions/triggers. Please update rule names in 
manifest file."
+  },
   {
     "id": "WARNINGS",
     "translation": "================= WARNINGS ==================="


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to